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.

abc cba
quelle
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

Michael Banzon
quelle
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.

Yves M.
quelle
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
Etwas auf
quelle
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