Existe-t-il un moyen de désérialiser le contenu JSON en un type dynamique C # 4? Ce serait bien de sauter la création d'un tas de classes pour utiliser le DataContractJsonSerializer.
Si vous voulez quelque chose de «dynamique», pourquoi ne pas simplement utiliser les accesseurs de style get fournis avec la plupart des décodeurs JSON qui ne vont pas à plain-old-object? (par exemple, existe-t-il vraiment un besoin de création d'objet «dynamique»?) json.org a un tas de liens pour les implémentations C # JSON.
Je travaille sur un projet qui essaie de réduire au minimum les dépendances externes. Donc, s'il est possible de trouver quelque chose avec les sérialiseurs .net et les types qui seraient préférés. Bien sûr, si ce n'est pas possible, je lance json.org. Merci!
jswanson
42
Je suis vraiment surpris que l'équipe C # ait ajouté «dynamique», mais il n'y a aucun moyen dans le CLR de convertir un objet JSON en une instance de classe CLR dynamique.
Frank Schwieterman
2
Malheureusement, la réponse acceptée ne fonctionne pas dans .NET 4 RTM. J'ai posté une réponse qui m'a aidé à aller de l'avant et qui pourrait être utile à d'autres.
Drew Noakes
(Bien qu'il semble que Newtonsoft JSON.NET se rapproche assez. Il n'y a pas vraiment de bons exemples, cependant.)
Hot Licks
Réponses:
660
Si vous êtes satisfait d'avoir une dépendance sur l' System.Web.Helpersassembly, vous pouvez utiliser la Jsonclasse:
dynamic data =Json.Decode(json);
Il est inclus avec le framework MVC en tant que téléchargement supplémentaire du framework .NET 4. Assurez-vous de donner une note positive à Vlad si cela est utile! Cependant, si vous ne pouvez pas supposer que l'environnement client inclut cette DLL, poursuivez votre lecture.
Une approche alternative de désérialisation est suggérée ici . J'ai légèrement modifié le code pour corriger un bug et convenir à mon style de codage. Tout ce dont vous avez besoin est ce code et une référence à System.Web.Extensionsvotre projet:
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}
J'obtiens une erreur dans obj = serializer.Deserialize dynamique (json, typeof (object)); disant qu'il n'y a pas de surcharge pour la méthode avec 2 arguments..dll erronée ou quoi?
Stewie Griffin
32
Vous pouvez utiliser System.Web.Helpers.Json - il propose une méthode Decode qui renvoie un objet dynamique. J'ai également posté cette information comme réponse.
Vlad Iliescu
2
Cela m'a également beaucoup aidé, mais je suis curieux de savoir ce que je dois faire si j'ai besoin d'utiliser la méthode .Serialize, qui ne génère actuellement qu'une exception NotImplementedException ... Je ne suis pas trop familier avec les classes scellées et / ou le résumé étendu Des classes. Est-ce que quelqu'un peut-il me montrer la bonne direction?
Cory W.
2
parfois en js vous avez des champs avec des caractères spéciaux comme "background-color". Pour accéder à ces champs dans js, vous devez obj ["background-color"]. Comment puis-je accéder à ces champs à partir de c # après la désérialisation en objet dynamique? Je ne peux pas faire obj.background-color, bien sûr, et obj ["background-color"] ne semble pas fonctionner. Ce serait bien si l'objet dynamique pouvait également être consulté en tant que dictionnaire, en même temps, exactement comme dans js.
Radu Simionescu
2
@RaduSimionescu Je suis probablement un peu en retard, mais cela aide peut-être les futurs visiteurs. J'ai eu le même problème, juste avec le nom de champ params(qui est un mot-clé en C #). De plus, TryGetMembervous pouvez remplacer TryGetIndex, ce qui vous donne exactement le même comportement que dans JS. Ensuite, vous pouvez faire obj["params"]ou obj["background-color"]pour les noms de champs maladroits.
@HotLicks: Pour introspecter la dynamique, stufffaites quelque chose comme:foreach (Newtonsoft.Json.Linq.JProperty jproperty in stuff) { Console.WriteLine("jproperty.Name = {0}", jproperty.Name);}
Matthias
11
Quelle est la différence entre JsonConvert.DeserializeObject et JObject.Parse? La réponse est de les utiliser tous les deux de la même manière pour faire la même chose mais n'explique pas la différence.
cja
7
@TomPeplow J'ai essayé cela. Ça n'a pas marché pour moi. Il indique que "JObject n'implémente pas 'Nom'".
Je ne peux pas faire fonctionner ça. J'ai réduit le problème à l'intérieur d'une asyncméthode. Si je rend la méthode synchrone, elle fonctionne comme prévu. Cependant, faites la méthode asyncet je ne peux pas obtenir un dynamic, je reçois juste un object. Le casting explicite ne fait rien, me donne toujours un object. Quelqu'un d'autre rencontre ce problème?
codeConcussion
295
Vous pouvez le faire en utilisant System.Web.Helpers.Json - sa méthode Decode renvoie un objet dynamique que vous pouvez parcourir à votre guise.
Il est inclus dans l'assembly System.Web.Helpers (.NET 4.0).
avez-vous essayé cela? Il revient Dictionary<string,object>. Sauf si je manque quelque chose, votre exemple ne renvoie pas d'objet dynamique.
sergiopereira
18
Cela ne fonctionne pas, il renvoie simplement un dict sous la forme d'une dynamique
mattmanser
55
@Peter Long Je crois que je n'ai pas exposé clairement mon cas, cher ami. Permettez-moi d'essayer de rectifier mon erreur. Je sais ce qu'est une dynamique. Cela ne vous permet pas de passer un objet JSON et d'utiliser d.code, vous devez faire d ["code"]. Valeur, ce qui n'est pas ce que la plupart des gens recherchent cette réponse, nous savons déjà comment obtenir le dictionnaire et le convertir en une dynamique est une perte de temps totale. Je ne suis respectueusement pas d'accord, monsieur.
mattmanser
4
@mattmanser, we already know how to get the dictionary and casting it to a dynamic. Il n'est pas nécessaire que ce soit un dictionnaire. Json a également des listes en plus du dictionnaire. Et aussi des listes et des dictionnaires pourraient être imbriqués. Mon code pourrait gérer toutes ces situations. MAIS votre méthode ne peut PAS.
Peter Long
4
@mattmanser a raison; il est possible d'implémenter IDynamicMetaObjectProvider(ou d'utiliser par exemple ExpandoObject) qui est capable d'intercepter des propriétés et de les rechercher dans un dictionnaire interne. Ceci combiné avec l'utilisation de dynamicpermet un code tel qu'il d.codesoit utilisé. Il est inutile de convertir un dictionnaire en une dynamique.
Stephen Drew
78
"Chaîne de données JSON" simple pour s'opposer sans aucun fichier DLL tiers:
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
Remarque: vous pouvez également utiliser votre objet personnalisé.
Je ne comprends pas. C'est de loin la solution la plus simple et personne ne la mentionne.
cikatomo
2
oui c'est simple :) parfois vous avez besoin de sérialiser mais vous ne voulez pas inclure la dll de la troisième partie
İbrahim Özbölük
Pouvez - vous préciser: comment dynamique peut accéder à l'objet désérialisé via: myObject["myprop"]? Je sais que c'est fait à l'exécution, mais comment y accéder via myObject["myprop"]est-il valide?
Royi Namir
1
Vous pouvez désérialiser votre objet comme Personel item = serializer.Deserialize <Personel> (getString); et si vous utilisez un objet dynamique, vous pouvez également utiliser un tableau et tout est possible comme everyobject
İbrahim Özbölük
3
Pour utiliser l'espace de noms System.Web.Script.Serialization, votre projet a besoin d'une référence à System.Web.Extensions.
StilgarISCA
28
JsonFx peut désérialiser le contenu JSON en objets dynamiques.
Sérialiser vers / depuis les types dynamiques (par défaut pour .NET 4.0):
J'ai créé une nouvelle version du DynamicJsonConverter qui utilise des objets Expando. J'ai utilisé des objets expando, car je voulais sérialiser la dynamique en JSON à l'aide de Json.NET.
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.
Vous pouvez étendre JavaScriptSerializer pour copier récursivement le dictionnaire qu'il a créé pour développer des objets, puis les utiliser dynamiquement:
Ensuite, il vous suffit d'avoir une instruction using pour l'espace de noms dans lequel vous avez défini l'extension (pensez simplement à les définir dans System.Web.Script.Serialization ... une autre astuce consiste à ne pas utiliser d'espace de noms, alors vous n'avez pas besoin de l'utilisation de du tout) et vous pouvez les consommer comme ceci:
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;}}
Après cela, j'utilise Newtonsoft.Json pour remplir la classe:
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);}}}
Vous pouvez l'appeler comme ceci:
Person jsonClass =JObjects.Get<Person>(stringJson);string stringJson =JObjects.Get(jsonClass);
PS:
Si le nom de votre variable JSON n'est pas un nom C # valide (le nom commence par $), vous pouvez corriger cela comme ceci:
Pour cela, j'utiliserais JSON.NET pour effectuer l'analyse de bas niveau du flux JSON, puis créer la hiérarchie d'objets à partir des instances de la ExpandoObjectclasse.
mais ce n'est pas le sujet de la question. il y a une différence lorsque vous devez spécifier le type de chaque chaîne json et travailler avec un type dynamique.
Illuminati
5
Regardez l'article que j'ai écrit sur CodeProject, qui répond précisément à la question:
Il y a beaucoup trop de choses à republier ici, et encore moins de points puisque cet article a une pièce jointe avec la clé / le fichier source requis.
cela m'a fait gagner beaucoup de temps! devrait être choisi comme meilleure réponse!
jsiot
4
La désérialisation dans JSON.NET peut être dynamique à l'aide de la JObjectclasse, qui est incluse dans cette bibliothèque. Ma chaîne JSON représente ces classes:
Désérialisons maintenant la chaîne SANS référencer les classes ci-dessus:
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());
Ou si vous voulez aller plus loin:
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());
Cette approche permet de "parcourir" le document jSON, de sorte que vous puissiez gérer une situation où la structure JSON est inconnue ou variable (par exemple, de nombreuses API retournent un document JSON complètement différent lorsqu'une erreur se produit). Il existe d'autres bibliothèques qui permettent de le faire, à part Newtonsoft.JSON (alias JSON.NET)?
Alex 75
4
L'objet souhaité DynamicJSONObject est inclus dans System.Web.Helpers.dll à partir du package de pages Web ASP.NET, qui fait partie de WebMatrix.
Utilisez DataSet (C #) avec JavaScript. Une fonction simple pour créer un flux JSON avec une entrée DataSet. Créez du contenu JSON comme (ensemble de données multi-tables):
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()}");}
Réponses:
Si vous êtes satisfait d'avoir une dépendance sur l'
System.Web.Helpers
assembly, vous pouvez utiliser laJson
classe:Il est inclus avec le framework MVC en tant que téléchargement supplémentaire du framework .NET 4. Assurez-vous de donner une note positive à Vlad si cela est utile! Cependant, si vous ne pouvez pas supposer que l'environnement client inclut cette DLL, poursuivez votre lecture.
Une approche alternative de désérialisation est suggérée ici . J'ai légèrement modifié le code pour corriger un bug et convenir à mon style de codage. Tout ce dont vous avez besoin est ce code et une référence à
System.Web.Extensions
votre projet:Vous pouvez l'utiliser comme ceci:
Donc, étant donné une chaîne JSON:
Le code suivant fonctionnera lors de l'exécution:
la source
params
(qui est un mot-clé en C #). De plus,TryGetMember
vous pouvez remplacerTryGetIndex
, ce qui vous donne exactement le même comportement que dans JS. Ensuite, vous pouvez faireobj["params"]
ouobj["background-color"]
pour les noms de champs maladroits.C'est assez simple en utilisant Json.NET :
Aussi
using Newtonsoft.Json.Linq
:Documentation: requête JSON avec dynamique
la source
stuff
faites quelque chose comme:foreach (Newtonsoft.Json.Linq.JProperty jproperty in stuff) { Console.WriteLine("jproperty.Name = {0}", jproperty.Name);}
async
méthode. Si je rend la méthode synchrone, elle fonctionne comme prévu. Cependant, faites la méthodeasync
et je ne peux pas obtenir undynamic
, je reçois juste unobject
. Le casting explicite ne fait rien, me donne toujours unobject
. Quelqu'un d'autre rencontre ce problème?Vous pouvez le faire en utilisant System.Web.Helpers.Json - sa méthode Decode renvoie un objet dynamique que vous pouvez parcourir à votre guise.
Il est inclus dans l'assembly System.Web.Helpers (.NET 4.0).
la source
.NET 4.0 dispose d'une bibliothèque intégrée pour ce faire:
C'est le moyen le plus simple.
la source
Dictionary<string,object>
. Sauf si je manque quelque chose, votre exemple ne renvoie pas d'objet dynamique.we already know how to get the dictionary and casting it to a dynamic
. Il n'est pas nécessaire que ce soit un dictionnaire. Json a également des listes en plus du dictionnaire. Et aussi des listes et des dictionnaires pourraient être imbriqués. Mon code pourrait gérer toutes ces situations. MAIS votre méthode ne peut PAS.IDynamicMetaObjectProvider
(ou d'utiliser par exempleExpandoObject
) qui est capable d'intercepter des propriétés et de les rechercher dans un dictionnaire interne. Ceci combiné avec l'utilisation dedynamic
permet un code tel qu'ild.code
soit utilisé. Il est inutile de convertir un dictionnaire en une dynamique."Chaîne de données JSON" simple pour s'opposer sans aucun fichier DLL tiers:
Remarque: vous pouvez également utiliser votre objet personnalisé.
la source
myObject["myprop"]
? Je sais que c'est fait à l'exécution, mais comment y accéder viamyObject["myprop"]
est-il valide?JsonFx peut désérialiser le contenu JSON en objets dynamiques.
la source
J'ai créé une nouvelle version du DynamicJsonConverter qui utilise des objets Expando. J'ai utilisé des objets expando, car je voulais sérialiser la dynamique en JSON à l'aide de Json.NET.
la source
Une autre façon d'utiliser Newtonsoft.Json :
la source
Vous pouvez y parvenir avec l'aide de Newtonsoft.Json. Installez Newtonsoft.Json à partir de Nuget et:
la source
La manière la plus simple est:
Incluez simplement ce fichier DLL .
Utilisez le code comme ceci:
la source
Vous pouvez étendre JavaScriptSerializer pour copier récursivement le dictionnaire qu'il a créé pour développer des objets, puis les utiliser dynamiquement:
Ensuite, il vous suffit d'avoir une instruction using pour l'espace de noms dans lequel vous avez défini l'extension (pensez simplement à les définir dans System.Web.Script.Serialization ... une autre astuce consiste à ne pas utiliser d'espace de noms, alors vous n'avez pas besoin de l'utilisation de du tout) et vous pouvez les consommer comme ceci:
la source
Vous pouvez utiliser
using Newtonsoft.Json
resolvedEvent.Event.Data
est ma réponse en appelant l'événement de base.la source
J'utilise http://json2csharp.com/ pour obtenir une classe représentant l'objet JSON.
Contribution:
Production:
Après cela, j'utilise Newtonsoft.Json pour remplir la classe:
Vous pouvez l'appeler comme ceci:
PS:
Si le nom de votre variable JSON n'est pas un nom C # valide (le nom commence par
$
), vous pouvez corriger cela comme ceci:la source
Pour cela, j'utiliserais JSON.NET pour effectuer l'analyse de bas niveau du flux JSON, puis créer la hiérarchie d'objets à partir des instances de la
ExpandoObject
classe.la source
J'utilise comme ça dans mon code et ça marche bien
la source
Regardez l'article que j'ai écrit sur CodeProject, qui répond précisément à la question:
Types dynamiques avec JSON.NET
Il y a beaucoup trop de choses à republier ici, et encore moins de points puisque cet article a une pièce jointe avec la clé / le fichier source requis.
la source
Une autre option consiste à "Coller JSON en tant que classes" afin qu'il puisse être désérialisé rapidement et facilement.
Voici une meilleure explication n piccas ... 'Coller JSON comme classes' dans ASP.NET et Web Tools 2012.2 RC
la source
La désérialisation dans JSON.NET peut être dynamique à l'aide de la
JObject
classe, qui est incluse dans cette bibliothèque. Ma chaîne JSON représente ces classes:Désérialisons maintenant la chaîne SANS référencer les classes ci-dessus:
Ou si vous voulez aller plus loin:
Voir l' article pour un exemple complet.
la source
L'objet souhaité DynamicJSONObject est inclus dans System.Web.Helpers.dll à partir du package de pages Web ASP.NET, qui fait partie de WebMatrix.
la source
Il existe une bibliothèque JSON légère pour C # appelée SimpleJson .
Il prend en charge .NET 3.5+, Silverlight et Windows Phone 7.
Il prend en charge dynamique pour .NET 4.0
Il peut également être installé en tant que package NuGet
la source
Utilisez DataSet (C #) avec JavaScript. Une fonction simple pour créer un flux JSON avec une entrée DataSet. Créez du contenu JSON comme (ensemble de données multi-tables):
Côté client, utilisez eval. Par exemple,
Utilisez ensuite:
la source
Pour obtenir un ExpandoObject:
la source
Essaye ça:
la source
Comment analyser du contenu JSON facile avec DynamicSerializer et JavaScript
Veuillez ajouter la référence de System.Web.Extensions et ajouter cet espace
using System.Web.Script.Serialization;
de noms en haut:Comment analyser un json imbriqué et complexe avec dynamic & JavaScriptSerializer
Veuillez ajouter la référence de System.Web.Extensions et ajouter cet espace
using System.Web.Script.Serialization;
de noms en haut:la source
Avec Cinchoo ETL - une bibliothèque open source disponible pour analyser JSON dans un objet dynamique:
Production:
Avertissement: je suis l'auteur de cette bibliothèque.
la source
essayez de cette façon!
Exemple JSON:
Code C #:
la source