2015-12-11 2 views
7

Ich habe einige JSON:Deserialisieren JSON in ein Objekt

{ 
    "foo" : [ 
     { "bar" : "baz" }, 
     { "bar" : "qux" } 
    ] 
} 

Und ich möchte diese in eine Sammlung deserialisieren. Ich habe diese Klasse definiert:

public class Foo 
{ 
    public string bar { get; set; } 
} 

jedoch der folgende Code funktioniert nicht:

JsonConvert.DeserializeObject<List<Foo>>(jsonString); 

Wie kann ich meine deserialisiert JSON?

+2

Dies wird als eine kanonische Frage gemeint für _ „Warum nicht diese Deserialisierung funktioniert“ _ und folgen einem allgemeinen Workflow Menschen konnten zeigen soll. Fühlen Sie sich frei, zu antworten, zu verbessern und als Doppelziel zu verwenden. – CodeCaster

Antwort

17

JSON Das ist kein Foo JSON Array. Der Code JsonConvert.DeserializeObject<T>(jsonString) den JSON-String von der Wurzel analysiert auf bis und Ihre Art T muss genau die JSON-Struktur entsprechen. Der Parser wird nicht raten welche JSON-Mitglied soll die List<Foo>, die Sie suchen, darstellen.

Sie benötigen ein Root-Objekt, das die JSON aus dem Wurzelelement darstellt.

Sie können ganz einfach die Klassen lassen, dass aus einer Probe JSON generiert werden tun. Kopieren Sie dazu Ihr JSON und klicken Sie in Visual Studio auf Edit -> Paste Special -> Paste JSON As Classes.

Alternativ können Sie das gleiche tun auf http://json2csharp.com, die die gleichen Klassen mehr oder weniger erzeugt.

Sie werden sehen, dass die Sammlung tatsächlich ein Element ist tiefer als erwartet:

public class Foo 
{ 
    public string bar { get; set; } 
} 

public class RootObject 
{ 
    public List<Foo> foo { get; set; } 
} 

Jetzt können Sie die JSON von der Wurzel deserialisieren (und sicher sein, RootObject zu etwas Nützliches benennen):

var rootObject = JsonConvert.DeserializeObject<RootObject>(jsonString); 

und die Sammlung zuzugreifen:

foreach (var foo in rootObject.foo) 
{ 
    // foo is a `Foo` 

} 

Sie können al Weisen umbenennen Eigenschaften Ihrer Gehäuse Konvention zu folgen und ein JsonProperty Attribut für sie gelten:

public class Foo 
{ 
    [JsonProperty("bar")] 
    public string Bar { get; set; } 
} 

auch sicher, dass die JSON genug Beispieldaten enthalten. Der Klassenparser muss den geeigneten C# -Typ basierend auf dem in JSON gefundenen Inhalt erraten.

+0

Danke @CodeCaster. Obwohl ich die Option "Einfügen" in VS2010 und VS2017 nicht finden konnte, hat der bereitgestellte Link die Aufgabe erfüllt. Beeindruckend. Ich wünschte, ich hätte vorher von dieser Seite gewusst. DANKE! – err1

Verwandte Themen