Newtonsoft JSON Deserialize


83

Mein JSON lautet wie folgt:

{"t":"1339886","a":true,"data":[],"Type":[['Ants','Biz','Tro']]}

Ich habe die Newtonsoft JSON.NET-Deserialisierungsbibliothek für C # gefunden. Ich habe versucht, es wie folgt zu verwenden:

object JsonDe = JsonConvert.DeserializeObject(Json); 

Wie kann ich auf das JsonDeObjekt zugreifen, um alle "Typ" -Daten abzurufen? Ich habe es mit einer Schleife versucht, aber es funktioniert nicht, weil das Objekt keinen Enumerator hat.



Sie sollten sich die Antwort auf diese Frage ansehen
— Dietz

Antworten:


133

Sie können eine Klasse implementieren, die die Felder enthält, die Sie in Ihrem JSON haben

class MyData
{
    public string t;
    public bool a;
    public object[] data;
    public string[][] type;
}

und verwenden Sie dann die generische Version von DeserializeObject:

MyData tmp = JsonConvert.DeserializeObject<MyData>(json);
foreach (string typeStr in tmp.type[0])
{
    // Do something with typeStr
}

Dokumentation: Serialisieren und Deserialisieren von JSON


Ich habe gerade ein Beispiel hinzugefügt, das nützlich sein sollte. Es ist mir ein Rätsel, warum der "Typ" eine Liste von Listen (Array-Array) ist - aber dies sollte mit der von Ihnen angegebenen JSON-Zeichenfolge übereinstimmen.
— Michael Banzon

1
Vielen Dank für Ihre Antwort. Es hat mir geholfen, mein Problem zu lösen :)
— Santosh Kumar Patro 13.

Ich habe eine Besetzung verwendet, die fehlgeschlagen ist MyData tmp = (MyData)JsonConvert.DeserializeObject(json);. Die generische Version von deserialize funktioniert dank viel besser. :-)
— SharpC

Ok, ich schreibe es hier: dotnet add package Newtonsoft.Jsonund using Newtonsoft.Json;.
— Dani Herrera

80

Eine viel einfachere Lösung: Verwenden eines dynamischen Typs

Ab Json.NET 4.0 Release 1 gibt es native dynamische Unterstützung. Sie müssen keine Klasse deklarieren, verwenden Sie einfach dynamic:

dynamic jsonDe = JsonConvert.DeserializeObject(json);

Alle Felder sind verfügbar:

foreach (string typeStr in jsonDe.Type[0])
{
    // Do something with typeStr
} 

string t = jsonDe.t;
bool a = jsonDe.a;
object[] data = jsonDe.data;
string[][] type = jsonDe.Type;

Mit dynamic müssen Sie keine bestimmte Klasse erstellen, um Ihre Daten zu speichern.


10
nette Antwort, vielen Dank für die Einführung mich dynamic:)
— maialithar

2
Es ist definitiv einfach. Dies hat jedoch den Nachteil, dass nicht einfach überprüft werden kann, ob eine Eigenschaft vorhanden ist (Sie sollten die Ausnahmebehandlung verwenden).
— Jowen

2
@Jowen Um zu überprüfen, ob eine Eigenschaft ohne Ausnahmebehandlung vorhanden ist, werfen Sie einen Blick auf diese Antworten
— Yves M.

Vielen Dank 1 !! Die einfachste Lösung, nach der ich so lange
— gesucht habe

9

Gemäß der Newtonsoft-Dokumentation können Sie auch ein anonymes Objekt wie das folgende deserialisieren:

var definition = new { Name = "" };

string json1 = @"{'Name':'James'}";
var customer1 = JsonConvert.DeserializeAnonymousType(json1, definition);

Console.WriteLine(customer1.Name);
// James

Das ist klug! ;-) Aber es wird ungeschickt, wenn die Definition nicht so einfach ist wie dein Beispiel.
— Sнаđошƒаӽ

Ich weiß nichts darüber definition, wie ich es DeserializeAnonymousTypein diesem Fall verwenden soll.
— Mehdi Dehghani

Dies ist ein wertloses Beispiel, da die meisten JSONs nicht annähernd so simpel sind. Ich würde gerne eine Definition sehen, die einer JSON-Zeichenfolge mit verschachtelten Eigenschaften
— ähnlicher ist
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.