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);
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);
Antworten:
Mit Json.NET können wir dies tun:
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 to JSON mit Json.NET
Siehe auch JObject.Parse und JArray.Parse
JArray.Parse
.
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 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>());
}
Der beste Weg, um die aktuelle Version zu erhalten, ist natürlich NuGet.
Aktualisiert (12.11.2014), um Kommentare zu adressieren:
Das funktioniert einwandfrei. Wenn Sie den Typ im Debugger überprüfen, werden Sie feststellen, dass der Wert tatsächlich dynamisch ist . Der zugrunde liegende Typ ist a JObject
. Wenn Sie den Typ steuern möchten (z. B. angeben) ExpandoObject
, tun Sie dies.
@Model.Prop
Namen in Razor nicht verwenden, wenn der Rückgabetyp JValue ist.
JValue
. Was mich verwirrte, weil ich im Debugger / Sofortfenster arbeitete und nicht nur string
s sah. David zeigt dies im unteren Screenshot. Das JValue
ist Cabrio, so dass Sie einfach tun könnenstring m = jsonResponse.message
Wenn Sie nur auf dynamisch deserialisieren, erhalten Sie ein JObject zurück. Mit einem ExpandoObject können Sie das bekommen, was Sie wollen.
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
Ich weiß, dass dies ein alter Beitrag ist, aber JsonConvert hat tatsächlich eine andere Methode, so wie es wäre
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
Ja, Sie können dies mit JsonConvert.DeserializeObject tun. Um das zu tun, machen Sie einfach:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvert
enthält keine Methode namens Deserialize
.
Hinweis: Als ich diese Frage im Jahr 2010 beantwortete, gab es keine Möglichkeit zum Deserialisieren ohne einen Typ. Dadurch konnten Sie deserialisieren, ohne die eigentliche Klasse definieren zu müssen, und eine anonyme Klasse konnte für die Deserialisierung verwendet werden.
Sie benötigen einen Typ, zu dem Sie deserialisieren können. Sie könnten etwas 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 in JSON Serializer. Der Link zum Deserialisieren zu anonymen Typen ist hier:
Wenn Sie JSON.NET mit einer alten Version verwenden, die nicht JObject war.
Dies ist eine weitere einfache Möglichkeit, ein dynamisches Objekt aus JSON zu erstellen: https://github.com/chsword/jdynamic
NuGet installieren
PM> Install-Package JDynamic
Unterstützung für die Verwendung des Zeichenfolgenindex 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 Dienstprogramm wie folgt verwenden:
Holen Sie sich den Wert direkt
dynamic json = new JDynamic("1");
//json.Value
2. Holen Sie sich das Mitglied im JSON-Objekt
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ählige
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.
Ja, es ist möglich. Ich habe das die ganze Zeit gemacht.
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
Für nicht native Typen ist es etwas schwieriger. Angenommen, in Ihrem Objekt 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>();