506 Stimmen

JSON-Objekt mit Json.net in ein dynamisches Objekt deserialisieren

Ist es möglich, ein dynamisches Objekt aus einer json Deserialisierung mit json.net zurückzugeben? Ich würde gerne etwas wie dieses tun:

dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);

3 Stimmen

Erwägen Sie die Generierung einer C#-Klasse aus JSON json2csharp.com und verwenden Sie die generierte Klasse anstelle der dynamischen

2 Stimmen

0 Stimmen

Wie kann man StackOverflow vorschlagen, eine Frage als "zu alt" zu schließen? Es ist sechs Jahre her, es gibt gültige Antworten und vernünftige Vorschläge für jede Version von .net seit damals... so viele, dass sie nicht mehr wirklich hilfreich sind.

625voto

Michael Pakhantsov Punkte 24167

Json.NET ermöglicht uns dies:

dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}");

Console.WriteLine(d.number);
Console.WriteLine(d.str);
Console.WriteLine(d.array.Count);

Ausgabe:

 1000
 string
 6

Dokumentation hier: LINQ zu JSON mit Json.NET

Siehe auch JObject.Parse y JArray.Parse

43 Stimmen

Beachten Sie, dass die Syntax für Arrays wie folgt lautet JArray.Parse .

7 Stimmen

Warum müssen wir ein dynamisches Wort verwenden? Ich habe Angst, ich habe es noch nie benutzt :D

4 Stimmen

In VB.Net müssen Sie Folgendes tun Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")

119voto

David Peden Punkte 16390

Ab Json.NET 4.0 Release 1 gibt es eine native dynamische Unterstützung:

[Test]
public void DynamicDeserialization()
{
    dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
    jsonResponse.Works = true;
    Console.WriteLine(jsonResponse.message); // Hi
    Console.WriteLine(jsonResponse.Works); // True
    Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
    Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
    Assert.That(jsonResponse, Is.TypeOf<JObject>());
}

Und natürlich ist der beste Weg, die aktuelle Version zu erhalten, über NuGet.

Aktualisiert (12.11.2014), um Kommentare zu berücksichtigen:

Das funktioniert einwandfrei. Wenn Sie den Typ im Debugger untersuchen, werden Sie sehen, dass der Wert in der Tat ist, dynamisch . Die zugrundeliegender Typ ist eine JObject . Wenn Sie den Typ kontrollieren wollen (z. B. durch Angabe von ExpandoObject dann tun Sie das.

enter image description here

25 Stimmen

Das scheint nie zu funktionieren. Es gibt nur ein JObject zurück, nicht eine dynamische Variable.

16 Stimmen

Übrigens, das funktioniert: JsonConvert.DeserializeObject<ExpandoObject>(STRING); mit der richtigen Deserialisierung, so dass wir nicht JObject usw. haben.

2 Stimmen

@Gutek nicht sicher, was Ihr Problem ist. Haben Sie den Code ausgeführt? Ich habe dem Test Asserts hinzugefügt und eine Eigenschaft hinzugefügt, die nicht im ursprünglichen json enthalten ist. Screenshot des Debuggers enthalten.

84voto

Joshua Peterson Punkte 1006

Wenn Sie einfach nach dynamic deserialisieren, erhalten Sie ein JObject zurück. Sie können bekommen, was Sie wollen, indem Sie ein ExpandoObject verwenden.

var converter = new ExpandoObjectConverter();    
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);

2 Stimmen

Das Ergebnis kann auch in ein Wörterbuch umgewandelt werden

1 Stimmen

Genau das, was ich gesucht habe! Danke!

49voto

epitka Punkte 16561

Ich weiß, dies ist alt Post, aber JsonConvert hat tatsächlich eine andere Methode, so dass es sein würde

var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);

28 Stimmen

Das wäre die Deserialisierung einer Json-Nutzlast in einen anonymen Typ, nicht in einen dynamischen Typ. Anonyme Typen und dynamische Typen sind unterschiedliche Dinge, und ich glaube nicht, dass dies die Frage gestellt adressiert.

1 Stimmen

Ist es notwendig, zwei Variablen zu verwenden? Warum wird die erste nicht in der zweiten Anweisung wiederverwendet?

40voto

oteal Punkte 566

Ja, Sie können es mit dem JsonConvert.DeserializeObject tun. Um das zu tun, tun Sie einfach:

dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);

2 Stimmen

JsonConvert enthält keine Methode namens Deserialize .

1 Stimmen

Es sollte nur DeserializeObject sein, aber dies sollte die akzeptierte Antwort IMO sein

1 Stimmen

Dies funktioniert :D Vielen Dank, alle anderen Antworten funktionierte nicht für mich. Ich habe versucht, DeserializeObject zu verwenden, aber anstelle von jsonResponse["message"] habe ich die Syntax verwendet, die ich normalerweise mit regulären Klassenobjekten verwende: jsonResponse.message

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X