Comment puis-je désérialiser JSON d'un simple Dictionnaire<string,string> dans ASP.NET?
J'ai une simple clé/valeur de la liste en JSON renvoyé à ASP.NET par la POSTE. Exemple:
{ "key1": "value1", "key2": "value2"}
JE N'ESSAIE PAS DE DÉSÉRIALISER EN FORTEMENT TYPÉES .NET OBJETS
J'ai simplement besoin d'un bon vieux Dictionnaire(De String, String), ou l'équivalent (table de hachage, Dictionnaire(De String, Object), de la vieille école StringDictionary--l'enfer, un 2-D tableau de chaînes de caractères pourrait fonctionner 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 à le client).
Apparemment, aucun de ces JSON bibliothèques ont ce front-gifles évidente de la capacité de la boîte, ils sont totalement axés sur la réflexion de la désérialisation via forte contrats.
Des idées?
Limitations:
- Je ne veux pas mettre en œuvre mon propre parser JSON
- Ne pouvez pas utiliser ASP.NET 4.0 encore
- Préfèrent rester à l'écart de la plus ancienne, obsolète ASP.NET la classe JSON
- re: limitation 3,
JavaScriptSerizlizer
est utilisé dans ASP.NET MVC et n'est plus obsolète. - c'est incroyable combien il était difficile de trouver un moyen simple de convertir une chaîne json dans quelque chose que je pourrais facilement les utiliser sans avoir besoin de parcourir de nombreux différents stackoverflow. C'est si facile que dans d'autres langues encore Java et C# semble sortir de leur façon de rendre la vie difficile.
Vous devez vous connecter pour publier un commentaire.
Json.NET est-ce que...
Plus d'exemples: La sérialisation des Collections avec Json.NET
dynamic
que le type pour les valeurs:JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
[{key: "a", value: "1"}, {key: "b", value:"2"}]
que vous avez à faire quelque chose comme ceci:var dict = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
DeseralizeObject
sur unSystem.Linq.Iqueryable
ToDictionary
stackoverflow.com/questions/953919/.... Je suis en utilisant ce pour remplir un jqGrid déroulante à partir de LINQJe n'ai découvrir .NET est un construit de manière à jeter la chaîne JSON dans un
Dictionary<String, Object>
via leSystem.Web.Script.Serialization.JavaScriptSerializer
type 3,5System.Web.Extensions
de l'assemblée. L'utilisation de la méthodeDeserializeObject(String)
.Je suis tombé sur ce que lorsque vous faites une requête ajax post (via jquery) de contenu de type 'application/json' static .net Page Méthode et vu que la méthode (qui n'avaient qu'un seul paramètre de type
Object
) comme par magie reçu ce Dictionnaire.var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
suivie parDictionary<string, object> dict = (Dictionary<string, object>)jsSerializer.DeserializeObject(jsonString);
Pour ceux à la recherche de l'internet et de tomber sur ce post, j'ai écrit un billet de blog sur comment utiliser la classe JavaScriptSerializer.
Lire la suite...
http://procbits.com/2011/04/21/quick-json-serializationdeserialization-in-c/
Voici un exemple:
Essayé de ne pas utiliser n'importe externe JSON mise en œuvre afin que je deserialised comme ceci:
System.Web.Script.Serialization
. Il fonctionne, tout simplement. J'ai même été en mesure d'utiliser "invalide" JSON commestring json = "{'id':13, 'value': true}";
.J'ai eu le même problème, j'ai donc écrit ce mon auto. Cette solution se distingue des autres réponses, car il peut désérialiser à plusieurs niveaux.
Suffit d'envoyer chaîne JSON à deserializeToDictionary fonction, il sera de retour non fortement typées
Dictionary<string, object>
objet.Ancien code
Ex: Ce sera le retour de
Dictionary<string, object>
objet d'un Facebook réponse JSON.Test
Mise à jour
Mon ancienne réponse fonctionne très bien si il n'y a pas de tableau sur la chaîne JSON. Ce un autre désérialiser un
List<object>
si un élément est un tableau.Il suffit d'envoyer une chaîne JSON à deserializeToDictionaryOrList fonction, il sera de retour non fortement typées
Dictionary<string, object>
objet ouList<object>
.is
etas
opérateurs grandement aidé moi et simplifié mon propre code.Si vous êtes après un léger, pas ajoutée références type d'approche, peut-être que ce morceau de code que je viens de travailler (je ne peux pas garantir à 100% la robustesse tout de même).
[Je me rends compte que cela porte atteinte à l'OP Limitation #1, mais techniquement, vous n'avez pas l'écrire, je n'ai]
System.RunTime.Serialization
n'est pas l'un d'entre eux, malheureusement JSON.NET en dépend, et il ne peut donc pas être utilisé. Grâce dexy pour votre excellent travail, j'ai osé pour l'améliorer un peu pour être en mesure de désérialiser des tableaux de tableaux, voir le code mis à jour dans ma réponse ici.J'ai juste besoin d'analyser une imbriquée dictionnaire, comme
où
JsonConvert.DeserializeObject
ne l'aide pas. J'ai trouvé l'approche suivante:La
SelectToken
vous permet de creuser le champ souhaité. Vous pouvez même spécifier un chemin d'accès comme"x.y.z"
à l'étape plus bas dans l'objet JSON.Edit: Cela fonctionne, mais le a accepté de répondre à l'aide de Json.NET est beaucoup plus simple. En laissant ce un au cas où quelqu'un a besoin de BCL-seul code.
Il n'est pas soutenu par la .NET framework hors de la boîte. Une flagrante de surveillance – pas tout le monde a besoin pour désérialiser des objets avec des propriétés nommées. J'ai donc fini par rouler mon propre:
Appelé avec:
Désolé pour le mélange de C# et VB.NET...
J'ai ajouté sur le code soumis par jSnake04 et Dasun ici. J'ai ajouté du code pour créer des listes d'objets à partir de
JArray
instances. Il a les deux sens de la récursivité, mais comme il fonctionne sur un fixe, fini l'arborescence de modèle, il n'y a pas de risque de débordement de pile, à moins que les données massives.J'ai ajouté une case pour les valeurs null dans le JSON pour l'autre réponse
J'ai eu le même problème j'ai donc écrit ce mon auto. Cette solution est
différenciée des autres réponses, car il peut désérialiser à
plusieurs niveaux.
Suffit d'envoyer chaîne json à deserializeToDictionary fonction
sera de retour non fortement typées
Dictionary<string, object>
objet.Ex: Ce sera le retour de
Dictionary<string, object>
objet d'un FacebookRéponse JSON.
Remarque: ville natale de plus amples désérialiser dans un
Dictionary<string, object>
objet.d.Value is JObject
. Vous n'avez pas à passer par la réflexion vérification des types. Et avec leis
l'opérateur, vous n'avez pas besoin de vérifier la valeur null. Elle retourne false si l'objet est null.