Essayer de convertir une chaîne JSON en un objet en C #. En utilisant un cas de test très simple:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Le problème est que routes_list n'est jamais défini; c'est un objet indéfini. Des idées?
JavaScriptSerializer
version over MS car elle n'acceptera rien d'autre que le formatage JSON personnalisé de WCF (par exemple, les champs de date qui ressemblent à des dates mais ne sont pas entourés de DATE () échouent lamentablement)Réponses:
Il semble que vous essayez de désérialiser en un objet brut. Vous pouvez créer une classe qui représente l'objet vers lequel vous convertissez. Cela serait plus utile dans les cas où vous avez affaire à des objets plus volumineux ou à des chaînes JSON.
Par exemple:
Ensuite, votre code de désérialisation serait:
Plus d'informations peuvent être trouvées dans ce tutoriel: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx
la source
Ou, vous pouvez utiliser la bibliothèque Newtownsoft.Json comme suit:
Où
T
est votre type d'objet qui correspond à votre chaîne JSON.la source
Vous ne voulez probablement pas simplement déclarer routes_list comme un
object
type. Il n'a pas de propriété .test, donc vous n'allez vraiment pas récupérer un bel objet. C'est l'un de ces endroits où il serait préférable de définir une classe ou une structure, ou d'utiliser le mot-clé dynamic.Si vous voulez vraiment que ce code fonctionne comme vous l'avez, vous devez savoir que l'objet renvoyé par DeserializeObject est un dictionnaire générique de chaîne, d'objet. Voici le code pour le faire de cette façon:
Si vous souhaitez utiliser le mot-clé dynamique, vous pouvez lire comment ici .
Si vous déclarez une classe ou une structure, vous pouvez appeler Deserialize au lieu de DeserializeObject comme ceci:
la source
object routes_list
. Utilisezvar
ou répétez-vous explicitement et déclarez routes_list en tant que IDictionary <string, object>.Utilisation d'un objet dynamique avec JavaScriptSerializer.
la source
Newtonsoft est plus rapide que le sérialiseur de script java. ... celui-ci dépend du package Newtonsoft NuGet, qui est populaire et meilleur que le sérialiseur par défaut.
solution de code en une ligne.
la source
Voici un cours simple que j'ai bricolé à partir de divers articles ... Il a été testé pendant environ 15 minutes, mais semble fonctionner pour mes besoins. Il utilise
JavascriptSerializer
pour faire le travail, qui peut être référencé dans votre application à l'aide des informations détaillées dans cet article .Le code ci-dessous peut être exécuté dans LinqPad pour le tester en:
J'espère que ça aide!
la source
Vous pouvez facilement répondre à vos besoins en utilisant la bibliothèque Newtonsoft.Json. J'écris l'exemple ci-dessous pour y jeter un coup d'œil.
Classe pour le type d'objet que vous recevez:
Code:
c'est un moyen très simple d'analyser votre json.
la source
Comme tripletdad99 l'a dit
mais si vous ne voulez pas créer un objet supplémentaire, vous pouvez le créer à la
Dictionary
placela source
ajoutez ce ddl pour faire référence à votre projet: System.Web.Extensions.dll
utilisez cet espace de noms: using System.Web.Script.Serialization;
la source
Copiez votre Json et collez-le dans la zone de texte sur json2csharp et cliquez sur le bouton Générer.
Une classe cs sera générée en utilisant ce fichier cs comme ci-dessous
Où
RootObject
est le nom du fichier cs généré ;la source
Un autre moyen rapide et facile de semi-automatiser ces étapes consiste à:
app.quicktype.io a généré des méthodes de sérialisation basées sur Newtonsoft. Alternativement, vous pouvez maintenant utiliser du code comme:
Client WebClient = nouveau WebClient ();
string myJSON = client.DownloadString (" https://URL_FOR_JSON.com/JSON_STUFF ");
var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject (myJSON);
la source
Convertissez une chaîne JSON en un objet en C #. En utilisant le cas de test ci-dessous ... cela a fonctionné pour moi. Ici, " MenuInfo " est mon objet de classe C #.
la source
Vous devez d'abord inclure une bibliothèque comme:
la source