J'ai une simple liste clé / valeur en JSON renvoyée à ASP.NET via POST. Exemple:
{ "key1": "value1", "key2": "value2"}
JE N'ESSAYE PAS DE DESERIALISER EN OBJETS .NET FORTEMENT TYPES
J'ai simplement besoin d'un vieux dictionnaire ordinaire (Of String, String) , ou d'un équivalent (table de hachage, Dictionary (Of String, Object), old-school StringDictionary - diable, un tableau 2-D de chaînes fonctionnerait pour moi.
Je peux utiliser tout ce qui est disponible dans ASP.NET 3.5, ainsi que le populaire Json.NET (que j'utilise déjà pour la sérialisation vers le client).
Apparemment, aucune de ces bibliothèques JSON ne dispose de cette capacité évidente de claquement de front - elles sont totalement axées sur la désérialisation basée sur la réflexion via des contrats forts.
Des idées?
Limites:
- Je ne veux pas implémenter mon propre analyseur JSON
- Impossible d'utiliser ASP.NET 4.0 pour le moment
- Je préférerais rester à l'écart de l'ancienne classe ASP.NET obsolète pour JSON
la source
JavaScriptSerizlizer
est utilisé dans ASP.NET MVC et n'est plus obsolète.Réponses:
Json.NET fait cela ...
Plus d'exemples: sérialisation de collections avec Json.NET
la source
dynamic
comme type pour les valeurs:JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
[{key: "a", value: "1"}, {key: "b", value:"2"}]
vous devez faire quelque chose comme ceci:var dict = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
J'ai découvert que .NET a une manière intégrée de convertir la chaîne JSON en
Dictionary<String, Object>
via leSystem.Web.Script.Serialization.JavaScriptSerializer
type dans l'System.Web.Extensions
assembly 3.5 . Utilisez la méthodeDeserializeObject(String)
.Je suis tombé sur cela en faisant un post ajax (via jquery) de type de contenu 'application / json' sur une méthode de page .net statique et j'ai vu que la méthode (qui avait un seul paramètre de type
Object
) recevait par magie ce dictionnaire.la source
var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
suivi deDictionary<string, object> dict = (Dictionary<string, object>)jsSerializer.DeserializeObject(jsonString);
SomeData: ""
Pour ceux qui recherchent sur Internet et tombent sur ce post, j'ai écrit un blog sur la façon d'utiliser la classe JavaScriptSerializer.
En savoir plus ... http://procbits.com/2011/04/21/quick-json-serializationdeserialization-in-c/
Voici un exemple:
la source
J'ai essayé de ne pas utiliser d'implémentation JSON externe, j'ai donc désérialisé comme ceci:
la source
System.Web.Script.Serialization
. Ça marche juste. J'ai même pu utiliser du JSON "invalide" commestring json = "{'id':13, 'value': true}";
.J'ai eu le même problème, alors j'ai écrit cela moi-même. Cette solution se différencie des autres réponses car elle peut désérialiser à plusieurs niveaux.
Envoyez simplement la chaîne JSON à la fonction deserializeToDictionary , elle retournera un objet non fortement typé
Dictionary<string, object>
.Ancien code
Ex: Cela retournera l'
Dictionary<string, object>
objet d'une réponse Facebook JSON.Tester
Mise à jour
Mon ancienne réponse fonctionne très bien s'il n'y a pas de tableau sur la chaîne JSON. Celui-ci se désérialise en un
List<object>
si un élément est un tableau.Envoyez simplement une chaîne JSON dans la fonction deserializeToDictionaryOrList , elle renverra un objet non fortement typé
Dictionary<string, object>
ouList<object>
.la source
is
et lesas
opérateurs m'a beaucoup aidé et simplifié mon propre code.Si vous recherchez une approche légère et sans références ajoutées, peut-être que ce morceau de code que je viens d'écrire fonctionnera (je ne peux cependant pas garantir à 100% la robustesse).
[Je me rends compte que cela viole la limitation OP # 1, mais techniquement, vous ne l'avez pas écrit, je l'ai fait]
la source
System.RunTime.Serialization
n'en fait pas partie, malheureusement JSON.NET dépend de et donc il ne peut pas être utilisé non plus. Merci dexy pour votre excellent travail, j'ai osé l'améliorer un peu pour pouvoir désérialiser des tableaux de tableaux, voir le code mis à jour dans ma réponse ici .J'avais juste besoin d'analyser un dictionnaire imbriqué , comme
où
JsonConvert.DeserializeObject
n'aide pas. J'ai trouvé l'approche suivante:Le
SelectToken
vous permet de creuser jusqu'au champ souhaité. Vous pouvez même spécifier un chemin d'accès comme"x.y.z"
descendre plus bas dans l'objet JSON.la source
System.Text.Json
Cela peut maintenant être fait en utilisant
System.Text.Json
qui est intégré à.net core 3.0
. Il est désormais possible de désérialiser JSON sans utiliser de bibliothèques tierces.Également disponible dans le package nu-get System.Text.Json si vous utilisez .Net Standard ou .Net Framework.
la source
System.Text.Json
est la voie à suivre ces jours-ci.Mark Rendle a posté cela comme un commentaire , je voulais le poster comme une réponse car c'est la seule solution qui a fonctionné jusqu'à présent pour renvoyer le succès et les codes d'erreur json résultant de la réponse de Google reCaptcha.
Merci encore, Mark!
la source
Edit: Cela fonctionne, mais la réponse acceptée en utilisant Json.NET est beaucoup plus simple. Laisser celui-ci au cas où quelqu'un aurait besoin d'un code BCL uniquement.
Il n'est pas pris en charge par le framework .NET prêt à l'emploi. Un oubli flagrant - tout le monde n'a pas besoin de se désérialiser en objets avec des propriétés nommées. J'ai donc fini par rouler le mien:
Appelé avec:
Désolé pour le mélange de C # et VB.NET…
la source
J'ai ajouté le code soumis par jSnake04 et Dasun ici. J'ai ajouté du code pour créer des listes d'objets à partir d'
JArray
instances. Il a une récursion bidirectionnelle mais comme il fonctionne sur un modèle d'arbre fini et fixe, il n'y a aucun risque de débordement de pile à moins que les données ne soient massives.la source
J'ai ajouté une vérification des valeurs nulles dans le JSON à l'autre réponse
J'ai eu le même problème alors j'ai écrit ça moi-même. Cette solution se différencie des autres réponses car elle peut désérialiser à plusieurs niveaux.
Envoyez simplement la chaîne json à la fonction deserializeToDictionary , elle renverra un objet non fortement typé
Dictionary<string, object>
.Ex: Cela retournera l'
Dictionary<string, object>
objet d'une réponse Facebook JSON.Remarque: la ville natale se désérialise davantage en un
Dictionary<string, object>
objet.la source
d.Value is JObject
. Vous n'avez pas à passer par la réflexion pour vérifier les types. Et avec l'is
opérateur, vous n'avez pas besoin de vérifier la valeur null. Elle retourne false si l'objet est nul.Il semble que toutes ces réponses ici supposent simplement que vous pouvez obtenir cette petite chaîne d'un objet plus gros ... pour les personnes qui cherchent simplement à déseréaliser un grand objet avec un tel dictionnaire quelque part dans le mappage, et qui utilisent le
System.Runtime.Serialization.Json
système DataContract, voici une solution:Une réponse sur gis.stackexchange.com avait ce lien intéressant . J'ai dû le récupérer avec archive.org, mais il offre une solution à peu près parfaite: une
IDataContractSurrogate
classe personnalisée dans laquelle vous implémentez exactement vos propres types. J'ai pu l'agrandir facilement.J'ai cependant apporté un tas de changements. Étant donné que la source d'origine n'est plus disponible, je publierai l'intégralité du cours ici:
Pour ajouter de nouveaux types pris en charge à la classe, il vous suffit d'ajouter votre classe, de lui donner les bons constructeurs et fonctions (regardez
SurrogateDictionary
un exemple), assurez-vous qu'elle hériteJsonSurrogateObject
et ajoutez son mappage de type auKnownTypes
dictionnaire. Le SurrogateDictionary inclus peut servir de base pour tous lesDictionary<String,T>
types où T est tout type qui désérialise correctement.L'appeler est vraiment simple:
Notez que pour une raison quelconque, cette chose a du mal à utiliser des chaînes de clés qui contiennent des espaces; ils n'étaient tout simplement pas présents dans la liste finale. Peut-être est-ce simplement contre les spécifications JSON et l'API que j'appelais a été mal implémentée, pensez-vous; Je ne sais pas. Quoi qu'il en soit, j'ai résolu ce problème en les remplaçant par des regex par des traits de soulignement dans les données brutes json et en corrigeant le dictionnaire après la désérialisation.
la source
Dictionary<String,String>
. Honnêtement, je n'ai jamais essayé de désérialiser des types complexes avec ce système.Sur la base des commentaires ci-dessus, essayez
JsonConvert.DeserializeObject<Dictionary<string,dynamic>>(json)
semble fonctionner même pour des objets et des listes complexes.
la source
Je viens de l'implémenter dans RestSharp . Ce message m'a été utile.
Outre le code dans le lien, voici mon code. J'obtiens maintenant un
Dictionary
résultat lorsque je fais quelque chose comme ceci:Soyez conscient du type de JSON que vous attendez - dans mon cas, je récupérais un seul objet avec plusieurs propriétés. Dans le lien ci-joint, l'auteur récupérait une liste.
la source
Mon approche se désérialise directement en IDictionary, sans JObject ou ExpandObject entre les deux. Le code utilise un convertisseur, qui est essentiellement copié à partir de la classe ExpandoObjectConverter trouvée dans le code source JSON.NET, mais en utilisant IDictionary au lieu de ExpandoObject.
Usage:
Code:
la source
Vous pouvez utiliser Tiny-JSON
la source
Un peu tard dans le jeu, mais aucune des solutions ci-dessus ne m'a orienté vers une solution .NET pure et simple, pas de solution json.net. Le voici donc, a fini par être très simple. Ci-dessous un exemple complet de la façon dont cela est fait avec la sérialisation JSON .NET standard, l'exemple a un dictionnaire à la fois dans l'objet racine et dans les objets enfants.
La balle dorée est ce chat, analysez les paramètres comme deuxième paramètre du sérialiseur:
Code complet ci-dessous:
la source
Assez ennuyeux, si vous souhaitez utiliser les classeurs de modèle par défaut, il semble que vous devrez utiliser des valeurs d'index numériques comme un formulaire POST.
Voir l'extrait suivant de cet article http://msdn.microsoft.com/en-us/magazine/hh781022.aspx :
la source
Je suggère d'utiliser
System.Runtime.Serialization.Json
cela fait partie de .NET 4.5.Ensuite, utilisez-le comme ceci:
la source
Pour toute personne qui essaie de convertir JSON en dictionnaire juste pour en extraire une valeur. il existe un moyen simple d' utiliser
Newtongsoft.JSON
la source