wake-up-neo.com

Wie konvertiert man ein Json-Array in eine Liste von Objekten in c #

Ich habe eine Json-Saite wie unten 

 {
"JsonValues":{

        "id": "MyID",

         "values": {
            "value1":{
                "id": "100",
                "diaplayName": "MyValue1"
            },
            "value2":{
                "id": "200",
                "diaplayName": "MyValue2"
            }
       }
}
}

Ich möchte Json-String in untergeordnete Klassen konvertieren

  class ValueSet
   {
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    [JsonProperty("values")]
    public List<Value> values
    {
        get;
        set;
    }
  }

class Value
{
    public string id
    {
        get;
        set;
    }
    public string DiaplayName
    {
        get;
        set;
    }
}

Mein Deserialisierungscode lautet 

JavaScriptSerializer js = new JavaScriptSerializer();
        StreamReader sr = new StreamReader(@"ValueSetJsonString.txt");
        string jsonString = sr.ReadToEnd();
        var items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

Aber ich bekomme nach der Serialisierung Nullwerte. Wie kann ich das lösen?

12
niknowj

Wie bereits erwähnt, erhalten Sie nicht die erwarteten Ergebnisse, weil Ihr JSON nicht mit der Klassenstruktur übereinstimmt, in die Sie zu deserialisieren versuchen. Sie müssen entweder Ihre JSON oder Ihre Klassen ändern. Da andere bereits gezeigt haben, wie man die JSON ändert, gehe ich hier umgekehrt vor.

Um mit dem in Ihrer Frage geposteten JSON übereinzustimmen, sollten Ihre Klassen wie folgt definiert sein. Beachten Sie, dass ich folgende Änderungen vorgenommen habe:

  1. Ich habe eine Wrapper-Klasse hinzugefügt, die dem äußeren Objekt in Ihrem JSON entspricht.
  2. Ich habe die Values-Eigenschaft der ValueSet-Klasse von einem List<Value> in einen Dictionary<string, Value> geändert, da die values-Eigenschaft in Ihrem JSON ein Objekt und kein Array enthält.
  3. Ich habe einige zusätzliche [JsonProperty]-Attribute hinzugefügt, um den Eigenschaftsnamen in Ihren JSON-Objekten zu entsprechen.

Klassendefinitionen:

class Wrapper
{
    [JsonProperty("JsonValues")]
    public ValueSet ValueSet { get; set; }
}

class ValueSet
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("values")]
    public Dictionary<string, Value> Values { get; set; }
}

class Value
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("diaplayName")]
    public string DisplayName { get; set; }
}

Sie müssen sich in die Wrapper-Klasse deserialisieren, nicht in die ValueSet-Klasse. Sie können dann die ValueSet von der Wrapper erhalten.

var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;

Hier ist ein Arbeitsprogramm zur Demonstration:

class Program
{
    static void Main(string[] args)
    {
        string jsonString = @"
        {
            ""JsonValues"": {
                ""id"": ""MyID"",
                ""values"": {
                    ""value1"": {
                        ""id"": ""100"",
                        ""diaplayName"": ""MyValue1""
                    },
                    ""value2"": {
                        ""id"": ""200"",
                        ""diaplayName"": ""MyValue2""
                    }
                }
            }
        }";

        var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;

        Console.WriteLine("id: " + valueSet.Id);
        foreach (KeyValuePair<string, Value> kvp in valueSet.Values)
        {
            Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id);
            Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName);
        }
    }
}

Und hier ist die Ausgabe:

id: MyID
value1 id: 100
value1 name: MyValue1
value2 id: 200
value2 name: MyValue2
15
Brian Rogers

http://json2csharp.com/

Ich fand den obigen Link unglaublich hilfreich, da er meine C # -Klassen korrigierte, indem er sie aus der tatsächlich zurückgegebenen JSON generierte.

Dann rief ich an:

JsonConvert.DeserializeObject<RootObject>(jsonString); 

und alles funktionierte wie erwartet.

7
bulltorious

Ihre Datenstruktur und Ihre JSON stimmen nicht überein.

Dein JSON ist folgendes:

{
    "JsonValues":{
        "id": "MyID",
        ...
    }
}

Die Datenstruktur, mit der Sie versuchen, sie zu serialisieren, ist folgende:

class ValueSet
{
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    ...
}

Sie überspringen einen Schritt: Ihr JSON ist eine Klasse mit einer Eigenschaft namens JsonValues, die ein Objekt Ihrer ValueSet-Datenstruktur als Wert hat.

In Ihrer Klasse ist Ihr JSON auch folgendes:

"values": { ... }

Ihre Datenstruktur lautet wie folgt:

[JsonProperty("values")]
public List<Value> values
{
    get;
    set;
}

Beachten Sie, dass { .. } in JSON ein Objekt definiert, wobei [ .. ] ein Array definiert. Entsprechend Ihrer JSON haben Sie also keine Menge von Werten, aber Sie haben ein one values-Objekt mit den Eigenschaften value1 und value2 vom Typ Value.

Da der Deserializer ein Array erwartet, aber stattdessen ein Objekt abruft, führt er das am wenigsten zerstörungsfreie (Exception) aus, was er tun könnte: überspringt den Wert. Ihre Eigenschaft values behält ihren Standardwert: null.

Wenn Sie können: Passen Sie Ihren JSON an. Folgendes würde zu Ihrer Datenstruktur passen und ist wahrscheinlich das, was Sie tatsächlich möchten:

{
    "id": "MyID",

     "values": [
         {
            "id": "100",
            "diaplayName": "MyValue1"
         }, {
            "id": "200",
            "diaplayName": "MyValue2"
         }
     ]
}
2
user2674389

Haben Sie überprüft, ob diese Zeile einwandfrei funktioniert und ob Ihre Zeichenfolge einen Wert enthält?

string jsonString = sr.ReadToEnd();

wenn ja, versuchen Sie diesen Code für die letzte Zeile:

ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

oder wenn du ein Array von json hast, kannst du die folgende Liste verwenden:

List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);

viel Glück

1
M2sh

sie haben eine nicht übereinstimmende jSon-Zeichenfolge. Wenn Sie in eine Liste konvertieren möchten, probieren Sie dies

{
    "id": "MyID",

     "values": [
        {
            "id": "100",
            "diaplayName": "MyValue1",
        },
        {
            "id": "200",
            "diaplayName": "MyValue2",
        }
   ]    
}
0
Hiệp Lê

Das ist auch möglich:

   using System.Web.Helpers;
   var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData);
0
usefulBee