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);
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);
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
Warum müssen wir ein dynamisches Wort verwenden? Ich habe Angst, ich habe es noch nie benutzt :D
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]}")
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.
Das scheint nie zu funktionieren. Es gibt nur ein JObject zurück, nicht eine dynamische Variable.
Übrigens, das funktioniert: JsonConvert.DeserializeObject<ExpandoObject>(STRING); mit der richtigen Deserialisierung, so dass wir nicht JObject usw. haben.
@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.
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.
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 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.
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
Mögliches Duplikat von JSON in C# dynamisches Objekt deserialisieren?
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.