comment convertir NameValueCollection à chaîne JSON?
J'ai essayé:
NameValueCollection Data = new NameValueCollection();
Data.Add("foo","baa");
string json = new JavaScriptSerializer().Serialize(Data);
il retourne: ["foo"]
je m'attendais à {"foo" : "baa"}
Comment puis-je faire cela?
Vous devez vous connecter pour publier un commentaire.
NameValueCollection
n'est pas un IDictionary, de sorte que leJavaScriptSerializer
ne peut sérialiser comme vous vous attendez à ce directement. Vous devez d'abord le convertir dans un dictionnaire, puis sérialiser.Mise à jour: questions suivantes concernant l'utilisation de plusieurs valeurs par clé, l'appel à
nvc[key]
renvoie simplement de les séparer par une virgule, ce qui peut être ok. Si non, on peut toujours faire appel àGetValues
et de décider quoi faire avec les valeurs de manière appropriée. Mis à jour le code ci-dessous pour afficher une manière possible.NameValueCollection
peut avoir plusieurs valeurs pour la clé, ce n'est pas de répondre à cette question.nvc[key]
serait juste de les retourner rejoint par un,
caractère. Mais par souci d'exhaustivité, j'ai mis à jour la réponse à être plus explicite à ce sujet.Une façon de sérialiser NameValueCollection est en convertissant d'abord à Dictionnaire et puis sérialiser le Dictionnaire. Pour convertir de dictionnaire:
Si vous avez besoin de faire la conversion fréquemment, vous pouvez également créer une méthode d'extension pour NameValueCollection:
de sorte que vous pouvez faire la conversion en une ligne comme ceci:
Alors vous pouvez sérialiser le dictionnaire:
Mais NameValueCollection peut avoir plusieurs valeurs pour une clé, par exemple:
Si vous sérialiser ce vous permettra de obtenir
{"Foo":"baa,again?"}
.Vous pouvez modifier le convertisseur de produire
IDictionary<string, string[]>
à la place:De sorte que vous pouvez être sérialisé valeur comme ceci:
{"Foo":["baa","again?"]}
.Si votre dictionnaire n'est pas destiné à contenir plusieurs entrées, vous pouvez utiliser la classe:
System.Collections.Specialized.ListDictionary
À des fins d'exhaustivité, et parce que la question continue à se poser (par exemple ici), aussi longtemps que vous utilisez Json.NET ou
DataContractJsonSerializer
(mais pasJavaScriptSerializer
), vous pouvez utiliser le l'adaptateur et envelopper leNameValueCollection
dans unIDictionary<string, string[]>
adaptateur, et sérialiser que l'utilisation de tout processus qui prend complètement en charge de la sérialisation d'arbitraire dictionnaires.Une fois que cette carte est comme suit:
Puis adaptée peut être construit pour un
NameValueCollection Data
simplement en faisant:Notes:
À l'aide de l'adaptateur peut être plus performant que le simple fait de créer une copie du dictionnaire, et devrait bien fonctionner avec n'importe quel sérialiseur qui prend entièrement en charge le dictionnaire de la sérialisation.
L'adaptateur peut également être utile dans l'aide d'une
NameValueCollection
avec tout autre code qui attend unIDictionary
de la sorte - c'est l'avantage fondamental de l'adaptateur.Cela étant dit,
JavaScriptSerializer
ne peut pas être utilisé avec l'adaptateur, car ce processus ne peut pas sérialiser un type arbitraire la mise en œuvre deIDictionary<TKey, TValue>
qui n'est pas aussi hériter deDictionary<TKey, TValue>
. Pour plus de détails voir La sérialisation des dictionnaires JavaScriptSerializer.Lors de l'utilisation de
DataContractJsonSerializer
, unNameValueCollection
peut être remplacé par un adaptateur dans le graphe de sérialisation à l'aide de la contrat de données de substitution mécanisme.Lors de l'utilisation de Json.NET un
NameValueCollection
peut être remplacé par un adaptateur à l'aide d'un customJsonConverter
telles que les suivantes:Qui pourrait être utilisé par exemple comme suit:
NameValueCollection
prend en charge toutes les opérations suivantesnull
valeur pour une clé donnée;NameValueCollection.Élément[String]
renvoie une liste séparée par des virgules de valeurs);NameValueCollection.Item[String]
).Ainsi la carte doit mettre en œuvre
IDictionary<string, string[]>
plutôt queIDictionary<string, string>
et prenez également le soin de gérer unnull
tableau de valeur.Échantillon de violon (y compris une unité de base de test) ici: https://dotnetfiddle.net/gVPSi7