[c#] Deserialize json-Objekt in dynamisches Objekt mit Json.net


3 Answers

Ab Json.NET 4.0 Release 1 gibt es 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 NuGet der beste Weg, um die aktuelle Version zu erhalten.

Aktualisiert (11/12/2014) um Kommentare zu adressieren:

Das funktioniert ganz gut. Wenn Sie den Typ im Debugger überprüfen, sehen Sie, dass der Wert tatsächlich dynamisch ist . Der zugrunde liegende Typ ist ein JObject . Wenn Sie den Typ steuern möchten (z. B. ExpandoObject , tun Sie dies.

Question

Ist es möglich, ein dynamisches Objekt aus einer JSON-Deserialisierung mit json.net zurückzugeben? Ich würde gerne so etwas machen:

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



Ich weiß, dass dies ein alter Post ist, aber JsonConvert hat tatsächlich eine andere Methode, so wäre es

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



Ja, es ist möglich. Das habe ich die ganze Zeit gemacht.

dynamic Obj = JsonConvert.DeserializeObject(<your json string>);

Es ist ein bisschen schwieriger für nicht-native Art. Angenommen, in Ihrem Obj befinden sich ein ClassA- und ein ClassB-Objekt. Sie werden alle in JObject konvertiert. Was Sie tun müssen, ist:

ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();



Hinweis: Zu der Zeit, als ich diese Frage 2010 beantwortete, gab es keine Möglichkeit, die Deserialisierung ohne irgendeine Art von Typ durchzuführen. Dies ermöglichte die Deserialisierung, ohne die tatsächliche Klasse definieren zu müssen und erlaubte die Verwendung einer anonymen Klasse für die Deserialisierung.

Sie müssen eine Art von Deserialisierungstyp haben. Du könntest etwas tun in der Art von:

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

Meine Antwort basiert auf einer Lösung für .NET 4.0 im JSON-Serializer. Link zum Deserialisieren zu anonymen Typen finden Sie hier:

http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx




Related