Wie schlagen Sie stackOverflow vor, eine Frage als "zu alt" zu schließen? Es ist sechs Jahre her, seitdem gibt es für jede Version von .net gültige Antworten und vernünftige Vorschläge ... so viele, dass sie nicht mehr wirklich hilfreich sind.
Andrew Lorien
Antworten:
546
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);
Beachten Sie, dass für Arrays die Syntax lautet JArray.Parse.
jgillich
4
Warum müssen wir ein dynamisches Wort verwenden? Ich habe Angst, noch nie benutzt: D
MonsterMMORPG
3
In VB.Net müssen Sie tunDim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
ilans
2
@MonsterMMORPG Das solltest du sein :) Dynamisch ist unter fast allen Umständen ein Anti-Pattern, aber hin und wieder kann es vorkommen, dass es sinnvoll ist, es zu verwenden.
Pluc
4
Bei Newtonsoft.Json 8.0.3 (.NET 4.5.2): Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ist aufgetreten. HResult = -2146233088 Message = 'Newtonsoft.Json.Linq.JObject' enthält keine Definition für 'number' Source = Microsoft .CSharp StackTrace: bei Microsoft.CSharp.RuntimeBinder.RuntimeBinderController.SubmitError (CError pError)
user4698855
107
Ab Json.NET 4.0 Release 1 gibt es native dynamische Unterstützung:
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.
Das scheint nie zu funktionieren. Es wird nur ein JObject zurückgegeben, keine dynamische Variable.
Paul
12
Übrigens funktioniert dies: JsonConvert.DeserializeObject <ExpandoObject> (STRING); mit der richtigen Deserialisierung, so dass wir kein JObject usw. haben
Gutek
2
@Gutek nicht sicher, was Ihr Problem ist. Hast du 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.
David Peden
1
@DavidPeden Wenn Sie JObject haben und versuchen, das in Razor zu binden, erhalten Sie Ausnahmen. Die Frage betraf die Deserialisierung in ein dynamisches Objekt - JObject ist dynamisch, enthält jedoch "eigene" Typen wie JValue, keine primitiven Typen. Ich kann den @Model.PropNamen in Razor nicht verwenden, wenn der Rückgabetyp JValue ist.
Gutek
2
Dies funktioniert, aber jede dynamische Eigenschaft ist a JValue. Was mich verwirrte, weil ich im Debugger / Sofortfenster arbeitete und nicht nur strings sah. David zeigt dies im unteren Screenshot. Das JValueist Cabrio, so dass Sie einfach tun könnenstring m = jsonResponse.message
Luke Puplett
66
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 =newExpandoObjectConverter();dynamic message =JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
Das würde bedeuten, eine json-Nutzlast in einen anonymen Typ zu deserialisieren, nicht in einen dynamischen Typ. Anonyme Typen und dynamische Typen sind verschiedene Dinge, und ich glaube nicht, dass dies die gestellte Frage anspricht.
jrista
1
Müssen zwei Variablen verwendet werden? Warum nicht den ersten in der zweiten Anweisung wiederverwenden?
RenniePet
21
Ja, Sie können dies mit JsonConvert.DeserializeObject tun. Um das zu tun, machen Sie einfach:
JsonConvertenthält keine Methode namens Deserialize.
Kann Poyrazoğlu
es sollte nur DeserializeObject sein, aber dies sollte die akzeptierte Antwort sein IMO
superjugy
21
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:
Ich bin bei dir. Ich weiß nicht, warum die Leute das ablehnen. Wenn jemand kann, bitte. Bitte erklären Sie, warum.
PEO
18
Sie stimmen ab, weil es um das Deserialisieren ohne Typ geht.
Richard
4
Die Antwort war zum Zeitpunkt des Schreibens im Jahr 2010 gültig, als es keine andere Lösung gab. Es war sogar die akzeptierte Antwort für einen kurzen Zeitraum, bis die Unterstützung in JSON.NET kam.
Phill
1
Dies erzeugt kein dynamisches Objekt. Dies erzeugt ein JObject, auf das Sie als dynamisch verweisen. Aber es ist immer noch ein JObject im Inneren.
Ghostbust555
5
Wenn Sie JSON.NET mit einer alten Version verwenden, die nicht JObject war.
Und Sie können dieses Dienstprogramm wie folgt verwenden:
Holen Sie sich den Wert direkt
dynamic json =newJDynamic("1");//json.Value
2. Holen Sie sich das Mitglied im JSON-Objekt
dynamic json =newJDynamic("{a:'abc'}");//json.a is a string "abc"dynamic json =newJDynamic("{a:3.1416}");//json.a is 3.1416mdynamic json =newJDynamic("{a:1}");//json.a is integer: 1
3. Unzählige
dynamic json =newJDynamic("[1,2,3]");/json.Length/json.Countis3//And you can use json[0]/ json[2] to get the elementsdynamic json =newJDynamic("{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 elementsdynamic json =newJDynamic("[{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 =newJDynamic("{a:{a:1} }");//json.a.a is 1.
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:
Antworten:
Mit Json.NET können wir dies tun:
Ausgabe:
Dokumentation hier: LINQ to JSON mit Json.NET
Siehe auch JObject.Parse und JArray.Parse
quelle
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:
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.quelle
@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 nurstring
s sah. David zeigt dies im unteren Screenshot. DasJValue
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.
quelle
Ich weiß, dass dies ein alter Beitrag ist, aber JsonConvert hat tatsächlich eine andere Methode, so wie es wäre
quelle
Ja, Sie können dies mit JsonConvert.DeserializeObject tun. Um das zu tun, machen Sie einfach:
quelle
JsonConvert
enthält keine Methode namensDeserialize
.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:
Meine Antwort basiert auf einer Lösung für .NET 4.0 in JSON Serializer. Der Link zum Deserialisieren zu anonymen Typen ist hier:
http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx
quelle
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
Unterstützung für die Verwendung des Zeichenfolgenindex für den Zugriff auf Mitglieder wie:
Testfall
Und Sie können dieses Dienstprogramm wie folgt verwenden:
Holen Sie sich den Wert direkt
2. Holen Sie sich das Mitglied im JSON-Objekt
3. Unzählige
Andere
quelle
Ja, es ist möglich. Ich habe das die ganze Zeit gemacht.
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:
quelle