Gibt es eine Möglichkeit, JSON-Inhalte in einen dynamischen C # 4-Typ zu deserialisieren? Es wäre schön, das Erstellen einer Reihe von Klassen zu überspringen, um die zu verwenden DataContractJsonSerializer.
Wenn Sie etwas 'Dynamisches' wollen, warum nicht einfach die Get-Style-Accessoren verwenden, die mit den meisten JSON-Decodern geliefert werden, die nicht zu einfachen alten Objekten gehören? (zB besteht wirklich Bedarf an 'dynamischer' Objekterstellung?) json.org verfügt über eine Reihe von Links für C # JSON-Implementierungen.
Ich arbeite an einem Projekt, das versucht, externe Abhängigkeiten auf ein Minimum zu beschränken. Also, wenn es möglich ist, etwas mit den serienmäßigen .net-Serialisierern und -Typen zu tun, die bevorzugt würden. Wenn es nicht möglich ist, melde ich mich natürlich bei json.org. Vielen Dank!
Jswanson
42
Ich bin wirklich überrascht, dass das C # -Team 'dynamic' hinzugefügt hat, aber dann gibt es in der CLR keine Möglichkeit, ein JSON-Objekt in eine dynamische CLR-Klasseninstanz zu konvertieren.
Frank Schwieterman
2
Leider funktioniert die akzeptierte Antwort in .NET 4 RTM nicht. Ich habe eine Antwort gepostet, die mir dabei geholfen hat, die für andere nützlich sein könnte.
Drew Noakes
(Obwohl es scheint, dass Newtonsoft JSON.NET ziemlich nahe kommt. Es gibt jedoch keine wirklich guten Beispiele.)
Hot Licks
Antworten:
659
Wenn Sie froh sind, eine Abhängigkeit von der System.Web.HelpersAssembly zu haben, können Sie die JsonKlasse verwenden:
dynamic data =Json.Decode(json);
Es ist im MVC-Framework als zusätzlicher Download zum .NET 4-Framework enthalten. Geben Sie Vlad eine positive Bewertung, wenn dies hilfreich ist! Wenn Sie jedoch nicht davon ausgehen können, dass die Clientumgebung diese DLL enthält, lesen Sie weiter.
Ein alternativer Deserialisation Ansatz wird vorgeschlagen , hier . Ich habe den Code leicht geändert, um einen Fehler zu beheben und meinem Codierungsstil zu entsprechen. Sie benötigen lediglich diesen Code und einen Verweis auf System.Web.ExtensionsIhr Projekt:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;publicsealedclassDynamicJsonConverter:JavaScriptConverter{publicoverrideobjectDeserialize(IDictionary<string,object> dictionary,Type type,JavaScriptSerializer serializer){if(dictionary ==null)thrownewArgumentNullException("dictionary");return type ==typeof(object)?newDynamicJsonObject(dictionary):null;}publicoverrideIDictionary<string,object>Serialize(object obj,JavaScriptSerializer serializer){thrownewNotImplementedException();}publicoverrideIEnumerable<Type>SupportedTypes{get{returnnewReadOnlyCollection<Type>(newList<Type>(new[]{typeof(object)}));}}#region Nested type: DynamicJsonObjectprivatesealedclassDynamicJsonObject:DynamicObject{privatereadonlyIDictionary<string,object> _dictionary;publicDynamicJsonObject(IDictionary<string,object> dictionary){if(dictionary ==null)thrownewArgumentNullException("dictionary");
_dictionary = dictionary;}publicoverridestringToString(){var sb =newStringBuilder("{");ToString(sb);return sb.ToString();}privatevoidToString(StringBuilder sb){var firstInDictionary =true;foreach(var pair in _dictionary){if(!firstInDictionary)
sb.Append(",");
firstInDictionary =false;varvalue= pair.Value;var name = pair.Key;if(valueisstring){
sb.AppendFormat("{0}:\"{1}\"", name,value);}elseif(valueisIDictionary<string,object>){newDynamicJsonObject((IDictionary<string,object>)value).ToString(sb);}elseif(valueisArrayList){
sb.Append(name +":[");var firstInArray =true;foreach(var arrayValue in(ArrayList)value){if(!firstInArray)
sb.Append(",");
firstInArray =false;if(arrayValue isIDictionary<string,object>)newDynamicJsonObject((IDictionary<string,object>)arrayValue).ToString(sb);elseif(arrayValue isstring)
sb.AppendFormat("\"{0}\"", arrayValue);else
sb.AppendFormat("{0}", arrayValue);}
sb.Append("]");}else{
sb.AppendFormat("{0}:{1}", name,value);}}
sb.Append("}");}publicoverrideboolTryGetMember(GetMemberBinder binder,outobject result){if(!_dictionary.TryGetValue(binder.Name,out result)){// return null to avoid exception. caller can check for null this way...
result =null;returntrue;}
result =WrapResultObject(result);returntrue;}publicoverrideboolTryGetIndex(GetIndexBinder binder,object[] indexes,outobject result){if(indexes.Length==1&& indexes[0]!=null){if(!_dictionary.TryGetValue(indexes[0].ToString(),out result)){// return null to avoid exception. caller can check for null this way...
result =null;returntrue;}
result =WrapResultObject(result);returntrue;}returnbase.TryGetIndex(binder, indexes,out result);}privatestaticobjectWrapResultObject(object result){var dictionary = result asIDictionary<string,object>;if(dictionary !=null)returnnewDynamicJsonObject(dictionary);var arrayList = result asArrayList;if(arrayList !=null&& arrayList.Count>0){return arrayList[0]isIDictionary<string,object>?newList<object>(arrayList.Cast<IDictionary<string,object>>().Select(x =>newDynamicJsonObject(x))):newList<object>(arrayList.Cast<object>());}return result;}}#endregion}
Ich erhalte einen Fehler in dynamic obj = serializer.Deserialize (json, typeof (object)); sagen, dass keine Überladung für Methode mit 2 Argumenten .. falsche DLL oder was?
Stewie Griffin
32
Sie können System.Web.Helpers.Json verwenden - es bietet eine Decode-Methode, die ein dynamisches Objekt zurückgibt. Ich habe diese Informationen auch als Antwort gepostet.
Vlad Iliescu
2
Das hat mir auch sehr geholfen, aber ich bin gespannt, was ich tun soll, wenn ich die .Serialize-Methode verwenden muss, die derzeit nur eine NotImplementedException auslöst ... Ich bin mit versiegelten Klassen und / oder erweiterten Abstracts nicht allzu vertraut Klassen. Kann mich jemand in die richtige Richtung weisen?
Cory W.
2
manchmal haben Sie in js Felder mit Sonderzeichen wie "Hintergrundfarbe". Um auf solche Felder in js zuzugreifen, tun Sie obj ["Hintergrundfarbe"]. Wie kann ich nach dem Deserialisieren auf ein dynamisches Objekt von c # aus auf solche Felder zugreifen? Ich kann natürlich keine obj.background-color machen und obj ["background-color"] scheint nicht zu funktionieren. Es wäre schön, wenn auf das dynamische Objekt gleichzeitig auch als Wörterbuch zugegriffen werden könnte, genau wie in js.
Radu Simionescu
2
@RaduSimionescu Ich bin wahrscheinlich etwas spät dran, aber vielleicht hilft dies zukünftigen Besuchern. Ich hatte das gleiche Problem, nur mit dem Feldnamen params(der ein Schlüsselwort in C # ist). Außerdem TryGetMemberkönnen Sie überschreiben TryGetIndex, wodurch Sie genau das gleiche Verhalten wie in JS erhalten. Dann können Sie obj["params"]oder obj["background-color"]für umständliche Feldnamen.
@ HotLicks: Um die Dynamik zu überprüfen, stuffmachen Sie etwas wie:foreach (Newtonsoft.Json.Linq.JProperty jproperty in stuff) { Console.WriteLine("jproperty.Name = {0}", jproperty.Name);}
Matthias
11
Was ist der Unterschied zwischen JsonConvert.DeserializeObject und JObject.Parse? Die Antwort ist, beide auf die gleiche Weise zu verwenden, um dasselbe zu tun, aber den Unterschied nicht zu erklären.
Cja
7
@ TomPeplow Versuchte dies. Bei mir hat es nicht funktioniert. Es heißt, dass "JObject 'Name' nicht implementiert".
Ich kann das nicht zum Laufen bringen. Ich habe das Problem auf eine asyncMethode eingegrenzt. Wenn ich die Methode synchronisiere, funktioniert sie wie erwartet. Allerdings mache die Methode asyncund ich kann keine bekommen dynamic, ich bekomme nur eine object. Explizites Casting macht nichts, gibt mir immer noch nur eine object. Erlebt das noch jemand?
CodeConcussion
295
Sie können dies mit System.Web.Helpers.Json tun Decode-Methode gibt ein dynamisches Objekt zurück, das Sie durchlaufen können.
Es ist in der Assembly System.Web.Helpers (.NET 4.0) enthalten.
hast du das versucht Es kehrt zurück Dictionary<string,object>. Sofern mir nichts fehlt, gibt Ihr Beispiel kein dynamisches Objekt zurück.
Sergiopereira
18
Dies funktioniert nicht, es gibt nur ein Diktat in Form eines dynamischen
Mattmanser
55
@ Peter Long Ich glaube, ich habe meinen Fall nicht klar dargelegt, lieber Kerl. Lassen Sie mich versuchen, meinen Fehler zu beheben. Ich weiß, was eine Dynamik ist. Dies erlaubt Ihnen nicht, ein JSON-Objekt zu übergeben und d.code zu verwenden. Sie müssten d ["code"] ausführen. Wert, den die meisten Leute, die diese Antwort finden, nicht wollen, wissen wir bereits Das Wörterbuch zu bekommen und es in eine Dynamik umzuwandeln, ist reine Zeitverschwendung. Ich bin respektvoll anderer Meinung, Sir.
Mattmanser
4
@mattmanser , we already know how to get the dictionary and casting it to a dynamic. Es muss kein Wörterbuch sein. Json hat neben dem Wörterbuch auch Listen. Außerdem können Listen und Wörterbücher verschachtelt werden. Mein Code könnte all diese Situationen bewältigen. ABER Ihre Methode kann NICHT.
Peter Long
4
@ Mattmanser ist richtig; Es ist möglich, Eigenschaften zu implementieren IDynamicMetaObjectProvider(oder zu verwenden ExpandoObject), die in der Lage sind, Eigenschaften abzufangen und in einem internen Wörterbuch nachzuschlagen. Dies in Kombination mit der Verwendung von dynamicermöglicht die Verwendung von Code d.code. Es ist irgendwie sinnlos, ein Wörterbuch in eine Dynamik umzuwandeln.
Stephen Drew
78
Einfache "String-JSON-Daten" zum Objektieren ohne DLL-Datei eines Drittanbieters:
WebClient client =newWebClient();string getString = client.DownloadString("https://graph.facebook.com/zuck");JavaScriptSerializer serializer =newJavaScriptSerializer();dynamic item = serializer.Deserialize<object>(getString);string name = item["name"];//note: JavaScriptSerializer in this namespaces//System.Web.Script.Serialization.JavaScriptSerializer
Hinweis: Sie können auch Ihr benutzerdefiniertes Objekt verwenden.
Ich verstehe es nicht. Dies ist bei weitem die einfachste Lösung, und niemand erwähnt sie.
Cikatomo
2
Ja, es ist einfach :) Manchmal müssen Sie serialisieren, möchten aber nicht die dritte Teil-DLL
einschließen
Können Sie näher erläutern: Wie dynamisch kann auf das DEserialized-Objekt zugegriffen werden über : myObject["myprop"]? Ich weiß, dass es zur Laufzeit gemacht wird, aber wie ist der Zugriff darauf myObject["myprop"]gültig?
Royi Namir
1
Sie können Ihr Objekt wie Personel item = serializer deserialisieren. Deserialize <Personel> (getString); und wenn Sie ein dynamisches Objekt verwenden, können Sie auch ein Array verwenden und alles ist möglich wie bei jedem Objekt
İbrahim Özbölük
3
Um den System.Web.Script.Serialization-Namespace verwenden zu können, benötigt Ihr Projekt einen Verweis auf System.Web.Extensions.
StilgarISCA
28
JsonFx kann JSON-Inhalte in dynamische Objekte deserialisieren.
Serialisieren zu / von dynamischen Typen (Standard für .NET 4.0):
Ich habe eine neue Version des DynamicJsonConverter erstellt, die Expando-Objekte verwendet. Ich habe expando-Objekte verwendet, weil ich die Dynamik mithilfe von Json.NET wieder in JSON serialisieren wollte.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
using System.Web.Script.Serialization;publicstaticclassDynamicJson{publicstaticdynamicParse(string json){JavaScriptSerializer jss =newJavaScriptSerializer();
jss.RegisterConverters(newJavaScriptConverter[]{newDynamicJsonConverter()});dynamic glossaryEntry = jss.Deserialize(json,typeof(object))asdynamic;return glossaryEntry;}classDynamicJsonConverter:JavaScriptConverter{publicoverrideobjectDeserialize(IDictionary<string,object> dictionary,Type type,JavaScriptSerializer serializer){if(dictionary ==null)thrownewArgumentNullException("dictionary");var result =ToExpando(dictionary);return type ==typeof(object)? result :null;}privatestaticExpandoObjectToExpando(IDictionary<string,object> dictionary){var result =newExpandoObject();var dic = result asIDictionary<String,object>;foreach(var item in dictionary){var valueAsDic = item.ValueasIDictionary<string,object>;if(valueAsDic !=null){
dic.Add(item.Key,ToExpando(valueAsDic));continue;}var arrayList = item.ValueasArrayList;if(arrayList !=null&& arrayList.Count>0){
dic.Add(item.Key,ToExpando(arrayList));continue;}
dic.Add(item.Key, item.Value);}return result;}privatestaticArrayListToExpando(ArrayList obj){ArrayList result =newArrayList();foreach(var item in obj){var valueAsDic = item asIDictionary<string,object>;if(valueAsDic !=null){
result.Add(ToExpando(valueAsDic));continue;}var arrayList = item asArrayList;if(arrayList !=null&& arrayList.Count>0){
result.Add(ToExpando(arrayList));continue;}
result.Add(item);}return result;}publicoverrideIDictionary<string,object>Serialize(object obj,JavaScriptSerializer serializer){thrownewNotImplementedException();}publicoverrideIEnumerable<Type>SupportedTypes{get{returnnewReadOnlyCollection<Type>(newList<Type>(new[]{typeof(object)}));}}}}
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 isdynamic 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.
Sie können den JavaScriptSerializer erweitern, um das erstellte Wörterbuch rekursiv zu kopieren, um Objekte zu erweitern, und sie dann dynamisch zu verwenden:
Dann brauchen Sie nur noch eine using-Anweisung für den Namespace, in dem Sie die Erweiterung definiert haben (definieren Sie sie einfach in System.Web.Script.Serialization ... ein weiterer Trick besteht darin, keinen Namespace zu verwenden, dann brauchen Sie die using nicht Aussage überhaupt) und Sie können sie so konsumieren:
var serializer =newJavaScriptSerializer();varvalue= serializer.DeserializeDynamic("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");var name =(string)value.Name;// Jon Smithvar age =(int)value.Age;// 42var address =value.Address;var city =(string)address.City;// New Yorkvar state =(string)address.State;// NY
publicclassChild{publicstring name {get;set;}publicint age {get;set;}}publicclassPerson{publicstring name {get;set;}publicint age {get;set;}publicstring city {get;set;}publicList<Child>Childs{get;set;}}
using Newtonsoft.Json;
namespace GitRepositoryCreator.Common{classJObjects{publicstaticstringGet(object p_object){returnJsonConvert.SerializeObject(p_object);}internalstatic T Get<T>(string p_object){returnJsonConvert.DeserializeObject<T>(p_object);}}}
Sie können es so nennen:
Person jsonClass =JObjects.Get<Person>(stringJson);string stringJson =JObjects.Get(jsonClass);
PS:
Wenn Ihr JSON-Variablenname kein gültiger C # -Name ist (Name beginnt mit $), können Sie dies folgendermaßen beheben:
Dafür würde ich JSON.NET verwenden, um das Parsen des JSON-Streams auf niedriger Ebene durchzuführen und dann die Objekthierarchie aus Instanzen der ExpandoObjectKlasse aufzubauen .
Aber darum geht es in der Frage nicht. Es gibt eine andere Möglichkeit, wenn Sie den Typ für jede JSON-Zeichenfolge angeben und mit dem dynamischen Typ arbeiten müssen.
Illuminati
5
Schauen Sie sich den Artikel an, den ich über CodeProject geschrieben habe und der die Frage genau beantwortet:
Es gibt viel zu viel, um alles hier erneut zu veröffentlichen, und noch weniger Sinn, da dieser Artikel einen Anhang mit dem Schlüssel / der erforderlichen Quelldatei enthält.
das hat mir viel zeit gespart! sollte als beste Antwort gewählt werden!
jsiot
4
Das Deserialisieren in JSON.NET kann mithilfe der JObjectKlasse, die in dieser Bibliothek enthalten ist, dynamisch sein . Meine JSON-Zeichenfolge repräsentiert diese Klassen:
Jetzt deserialisieren wir den String, OHNE auf die obigen Klassen zu verweisen:
var dyn =JsonConvert.DeserializeObject<JObject>(jsonAsFooString);JProperty propAge = dyn.Properties().FirstOrDefault(i=>i.Name=="Age");if(propAge !=null){int age =int.Parse(propAge.Value.ToString());Console.WriteLine("age="+ age);}//or as a one-liner:int myage =int.Parse(dyn.Properties().First(i=>i.Name=="Age").Value.ToString());
Oder wenn Sie tiefer gehen wollen:
var propBar = dyn.Properties().FirstOrDefault(i=>i.Name=="Bar");if(propBar !=null){JObject o =(JObject)propBar.First();var propBDay = o.Properties().FirstOrDefault(i => i.Name=="BDay");if(propBDay !=null){DateTime bday =DateTime.Parse(propBDay.Value.ToString());Console.WriteLine("birthday="+ bday.ToString("MM/dd/yyyy"));}}//or as a one-liner:DateTime mybday =DateTime.Parse(((JObject)dyn.Properties().First(i=>i.Name=="Bar").First()).Properties().First(i=>i.Name=="BDay").Value.ToString());
Ein vollständiges Beispiel finden Sie im Beitrag .
Dieser Ansatz ermöglicht das "Durchlaufen" des jSON-Dokuments, sodass Sie Situationen verwalten können, in denen die JSON-Struktur unbekannt oder variabel ist (z. B. geben viele APIs bei Auftreten eines Fehlers ein völlig anderes JSON-Dokument zurück). Abgesehen von Newtonsoft.JSON (auch bekannt als JSON.NET) gibt es andere Bibliotheken, die dies zulassen?
Alex 75
4
Das gewünschte Objekt DynamicJSONObject ist in der System.Web.Helpers.dll aus dem ASP.NET-Webseitenpaket enthalten, das Teil von WebMatrix ist.
Verwenden Sie DataSet (C #) mit JavaScript. Eine einfache Funktion zum Erstellen eines JSON-Streams mit DataSet-Eingabe. Erstellen Sie JSON-Inhalte wie (Multi-Table-Dataset):
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;Container container =JsonConvert.Deserialize<Container>(jsonAsString,newExpandoObjectConverter());
var jsonString =(File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(),"delete_result.json")));var objects =JsonConvert.DeserializeObject<dynamic>(jsonString);foreach(var o in objects){Console.WriteLine($"{o.id.ToString()}");}
Antworten:
Wenn Sie froh sind, eine Abhängigkeit von der
System.Web.Helpers
Assembly zu haben, können Sie dieJson
Klasse verwenden:Es ist im MVC-Framework als zusätzlicher Download zum .NET 4-Framework enthalten. Geben Sie Vlad eine positive Bewertung, wenn dies hilfreich ist! Wenn Sie jedoch nicht davon ausgehen können, dass die Clientumgebung diese DLL enthält, lesen Sie weiter.
Ein alternativer Deserialisation Ansatz wird vorgeschlagen , hier . Ich habe den Code leicht geändert, um einen Fehler zu beheben und meinem Codierungsstil zu entsprechen. Sie benötigen lediglich diesen Code und einen Verweis auf
System.Web.Extensions
Ihr Projekt:Sie können es so verwenden:
Also, gegeben eine JSON-Zeichenfolge:
Der folgende Code funktioniert zur Laufzeit:
quelle
params
(der ein Schlüsselwort in C # ist). AußerdemTryGetMember
können Sie überschreibenTryGetIndex
, wodurch Sie genau das gleiche Verhalten wie in JS erhalten. Dann können Sieobj["params"]
oderobj["background-color"]
für umständliche Feldnamen.Mit Json.NET ist das ganz einfach :
Auch
using Newtonsoft.Json.Linq
:Dokumentation: Abfrage von JSON mit Dynamic
quelle
stuff
machen Sie etwas wie:foreach (Newtonsoft.Json.Linq.JProperty jproperty in stuff) { Console.WriteLine("jproperty.Name = {0}", jproperty.Name);}
async
Methode eingegrenzt. Wenn ich die Methode synchronisiere, funktioniert sie wie erwartet. Allerdings mache die Methodeasync
und ich kann keine bekommendynamic
, ich bekomme nur eineobject
. Explizites Casting macht nichts, gibt mir immer noch nur eineobject
. Erlebt das noch jemand?Sie können dies mit System.Web.Helpers.Json tun Decode-Methode gibt ein dynamisches Objekt zurück, das Sie durchlaufen können.
Es ist in der Assembly System.Web.Helpers (.NET 4.0) enthalten.
quelle
.NET 4.0 verfügt über eine integrierte Bibliothek, um dies zu tun:
Dies ist der einfachste Weg.
quelle
Dictionary<string,object>
. Sofern mir nichts fehlt, gibt Ihr Beispiel kein dynamisches Objekt zurück.we already know how to get the dictionary and casting it to a dynamic
. Es muss kein Wörterbuch sein. Json hat neben dem Wörterbuch auch Listen. Außerdem können Listen und Wörterbücher verschachtelt werden. Mein Code könnte all diese Situationen bewältigen. ABER Ihre Methode kann NICHT.IDynamicMetaObjectProvider
(oder zu verwendenExpandoObject
), die in der Lage sind, Eigenschaften abzufangen und in einem internen Wörterbuch nachzuschlagen. Dies in Kombination mit der Verwendung vondynamic
ermöglicht die Verwendung von Coded.code
. Es ist irgendwie sinnlos, ein Wörterbuch in eine Dynamik umzuwandeln.Einfache "String-JSON-Daten" zum Objektieren ohne DLL-Datei eines Drittanbieters:
Hinweis: Sie können auch Ihr benutzerdefiniertes Objekt verwenden.
quelle
myObject["myprop"]
? Ich weiß, dass es zur Laufzeit gemacht wird, aber wie ist der Zugriff daraufmyObject["myprop"]
gültig?JsonFx kann JSON-Inhalte in dynamische Objekte deserialisieren.
quelle
Ich habe eine neue Version des DynamicJsonConverter erstellt, die Expando-Objekte verwendet. Ich habe expando-Objekte verwendet, weil ich die Dynamik mithilfe von Json.NET wieder in JSON serialisieren wollte.
quelle
Eine andere Möglichkeit, Newtonsoft.Json zu verwenden :
quelle
Sie können dies mit Hilfe von Newtonsoft.Json erreichen. Installieren Sie Newtonsoft.Json von Nuget und:
quelle
Der einfachste Weg ist:
Fügen Sie einfach diese DLL-Datei hinzu .
Verwenden Sie den Code wie folgt:
quelle
Sie können den JavaScriptSerializer erweitern, um das erstellte Wörterbuch rekursiv zu kopieren, um Objekte zu erweitern, und sie dann dynamisch zu verwenden:
Dann brauchen Sie nur noch eine using-Anweisung für den Namespace, in dem Sie die Erweiterung definiert haben (definieren Sie sie einfach in System.Web.Script.Serialization ... ein weiterer Trick besteht darin, keinen Namespace zu verwenden, dann brauchen Sie die using nicht Aussage überhaupt) und Sie können sie so konsumieren:
quelle
Sie können verwenden
using Newtonsoft.Json
resolvedEvent.Event.Data
ist meine Antwort vom Aufrufen des Kernereignisses.quelle
Ich verwende http://json2csharp.com/ , um eine Klasse zu erhalten, die das JSON-Objekt darstellt.
Eingang:
Ausgabe:
Danach benutze ich Newtonsoft.Json , um die Klasse zu füllen:
Sie können es so nennen:
PS:
Wenn Ihr JSON-Variablenname kein gültiger C # -Name ist (Name beginnt mit
$
), können Sie dies folgendermaßen beheben:quelle
Dafür würde ich JSON.NET verwenden, um das Parsen des JSON-Streams auf niedriger Ebene durchzuführen und dann die Objekthierarchie aus Instanzen der
ExpandoObject
Klasse aufzubauen .quelle
Ich verwende so in meinem Code und es funktioniert gut
quelle
Schauen Sie sich den Artikel an, den ich über CodeProject geschrieben habe und der die Frage genau beantwortet:
Dynamische Typen mit JSON.NET
Es gibt viel zu viel, um alles hier erneut zu veröffentlichen, und noch weniger Sinn, da dieser Artikel einen Anhang mit dem Schlüssel / der erforderlichen Quelldatei enthält.
quelle
Eine andere Option ist "JSON als Klassen einfügen", damit es schnell und einfach deserialisiert werden kann.
Hier ist eine bessere Erklärung n piccas ... 'JSON als Klassen einfügen ' in ASP.NET und Web Tools 2012.2 RC
quelle
Das Deserialisieren in JSON.NET kann mithilfe der
JObject
Klasse, die in dieser Bibliothek enthalten ist, dynamisch sein . Meine JSON-Zeichenfolge repräsentiert diese Klassen:Jetzt deserialisieren wir den String, OHNE auf die obigen Klassen zu verweisen:
Oder wenn Sie tiefer gehen wollen:
Ein vollständiges Beispiel finden Sie im Beitrag .
quelle
Das gewünschte Objekt DynamicJSONObject ist in der System.Web.Helpers.dll aus dem ASP.NET-Webseitenpaket enthalten, das Teil von WebMatrix ist.
quelle
Es gibt eine leichtgewichtige JSON-Bibliothek für C # SimpleJson .
Es unterstützt .NET 3.5+, Silverlight und Windows Phone 7.
Es unterstützt Dynamic für .NET 4.0
Es kann auch als NuGet-Paket installiert werden
quelle
Verwenden Sie DataSet (C #) mit JavaScript. Eine einfache Funktion zum Erstellen eines JSON-Streams mit DataSet-Eingabe. Erstellen Sie JSON-Inhalte wie (Multi-Table-Dataset):
Nur Client-Seite, verwenden Sie eval. Zum Beispiel,
Dann benutze:
quelle
So erhalten Sie ein ExpandoObject:
quelle
Versuche dies:
quelle
So analysieren Sie einfache JSON-Inhalte mit Dynamic & JavaScriptSerializer
Bitte fügen Sie die Referenz von System.Web.Extensions hinzu und fügen Sie diesen Namespace
using System.Web.Script.Serialization;
oben hinzu:So analysieren Sie verschachtelte und komplexe JSON mit Dynamic & JavaScriptSerializer
Bitte fügen Sie die Referenz von System.Web.Extensions hinzu und fügen Sie diesen Namespace
using System.Web.Script.Serialization;
oben hinzu:quelle
Mit Cinchoo ETL - einer Open Source-Bibliothek, mit der JSON in ein dynamisches Objekt analysiert werden kann:
Ausgabe:
Haftungsausschluss: Ich bin der Autor dieser Bibliothek.
quelle
versuche es so!
JSON-Beispiel:
C # -Code:
quelle