it-swarm.com.de

Deserialisieren Sie das Json-Objekt mithilfe von Json.net in ein dynamisches Objekt

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

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

neueste json.net-Version erlaubt 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

483

Seit Json.NET 4.0 Version 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>());
}

Natürlich ist der beste Weg, um die aktuelle Version zu erhalten, über NuGet.

Aktualisiert (11/12/2014) für Kommentare:

Das funktioniert einwandfrei. Wenn Sie den Typ im Debugger überprüfen, werden Sie feststellen, dass der Wert tatsächlich dynamic ist. Der zugrunde liegende Typ ist eine JObject. Wenn Sie den Typ steuern möchten (z. B. ExpandoObject), dann tun Sie dies.

enter image description here

97
David Peden

Wenn Sie sich nur auf Dynamik deserialisieren, erhalten Sie ein JObject zurück. Mit einem ExpandoObject erhalten Sie, was Sie möchten.

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

Ich weiß, das ist ein alter Beitrag, aber JsonConvert hat tatsächlich eine andere Methode

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

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

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

Anmerkung: Als ich 2010 diese Frage beantwortete, gab es keine Möglichkeit, ohne eine Art Deserialisierung zu deserialisieren. Dies ermöglichte es Ihnen, die Deserialisierung durchzuführen, ohne die eigentliche Klasse definieren zu müssen und eine anonyme Klasse verwenden zu können die Deserialisierung. 


Sie müssen über eine Art Deserialisierungstyp verfügen. Sie könnten etwas in der Art von machen:

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, die im JSON-Serialisierer erstellt wird. Link zur Deserialisierung auf anonyme Typen ist hier:

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

18
Phill

Wenn Sie JSON.NET mit einer alten Version verwenden, die kein JObject ist.

Dies ist eine weitere einfache Möglichkeit, ein dynamisches Objekt aus JSON zu erstellen: https://github.com/chsword/jdynamic

NuGet Install

PM> Install-Package JDynamic

Unterstützt die Verwendung des String-Index für den Zugriff auf Mitglieder wie:

dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);

Testfall

Und Sie können dieses Programm wie folgt verwenden:

Holen Sie sich den Wert direkt

dynamic json = new JDynamic("1");

//json.Value

2.Geben Sie das Mitglied in das Json-Objekt ein

dynamic json = new JDynamic("{a:'abc'}");
//json.a is a string "abc"

dynamic json = new JDynamic("{a:3.1416}");
//json.a is 3.1416m

dynamic json = new JDynamic("{a:1}");
//json.a is integer: 1

3. unzählig

dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
//And you can use json[0]/ json[2] to get the elements

dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
//And you can use  json.a[0]/ json.a[2] to get the elements

dynamic json = new JDynamic("[{b:1},{c:1}]");
//json.Length/json.Count is 2.
//And you can use the  json[0].b/json[1].c to get the num.

Andere

dynamic json = new JDynamic("{a:{a:1} }");

//json.a.a is 1.
5
chsword

Ja, es ist möglich. Ich habe das die ganze Zeit gemacht.

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

Es ist etwas schwieriger für nicht native Typen. Angenommen, in Ihrem Obj gibt es ClassA- und ClassB-Objekte. Sie werden alle in JObject konvertiert. Was Sie tun müssen, ist:

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