La désérialisation problème avec DataContractJsonSerializer
J'ai le morceau suivant du JSON:
[{
"name": "numToRetrieve",
"value": "3",
"label": "Number of items to retrieve:",
"items": {
"1": "1",
"3": "3",
"5": "5"
},
"rules": {
"range": "1-2"
}
},
{
"name": "showFoo",
"value": "on",
"label": "Show foo?"
},
{
"name": "title",
"value": "Foo",
"label": "Foo:"
}]
Le tout dans une version en ligne (adapté pour un littéral de chaîne):
[{\"name\":\"numToRetrieve\",\"value\":\"3\",\"label\":\"Number of items to retrieve:\",\"items\":{\"1\":\"1\",\"3\":\"3\",\"5\":\"5\"},\"rules\":{\"range\":\"1-2\"}},{\"name\":\"showFoo\",\"value\":\"on\",\"label\":\"Show foo?\"},{\"name\":\"title\",\"value\":\"Foo\",\"label\":\"Foo:\"}]
Dans l'exemple ci-dessus, name
, value
, et label
sont nécessaires, mais items
et rules
sont facultatifs.
Ici est la classe je suis en train de désérialiser dans:
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace foofoo
{
[DataContract]
public sealed class FooDef
{
[DataMember(Name = "name", IsRequired = true)]
public string Name { get; set; }
[DataMember(Name = "value", IsRequired = true)]
public string Value { get; set; }
[DataMember(Name = "label", IsRequired = true)]
public string Label { get; set; }
[DataMember(Name = "items", IsRequired = false)]
public Dictionary<string, string> Items { get; set; }
[DataMember(Name = "rules", IsRequired = false)]
public Dictionary<string, string> Rules { get; set; }
}
}
Voici le code que j'utilise pour désérialiser:
var json = new DataContractJsonSerializer(typeof(List<FooDef>));
var bar = "[{\"name\":\"numToRetrieve\",\"value\":\"3\",\"label\":\"Number of items to retrieve:\",\"items\":{\"1\":\"1\",\"3\":\"3\",\"5\":\"5\"},\"rules\":{\"range\":\"1-2\"}},{\"name\":\"showFoo\",\"value\":\"on\",\"label\":\"Show foo?\"},{\"name\":\"title\",\"value\":\"Foo\",\"label\":\"Foo:\"}]";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(bar));
var foo = json.ReadObject(stream);
stream.Close();
Tout se passe assez bien, sauf que items
et rules
sont vides pour la première FooDef
passer. J'ai essayé de tout sous le soleil pour essayer et obtenir peuplées: les classes personnalisées, NameValueCollection
, KeyValuePair<string, string>
, List
de ces deux derniers, et tous les autres de la collection qui semblait s'appliquer. [EDIT: j'ai oublié d'essayer Hashtable
, ce qui semblait être un candidat évident. N'a pas fonctionné.]
Le problème, comme je le vois, c'est que la pièce clé sous items
et rules
est ouverte. Qui est, il n'est pas toujours va être appelé range
ou 3
. Des conseils ou des idées?
Vous devez vous connecter pour publier un commentaire.
À mon humble avis il n'y a aucun moyen de désérialiser la chaîne JSON que vous avez fourni dans une .NET classe à l'aide de DataContractJsonSerializer.
Le problème vient de la façon dont DataContractJsonSerializer sérialise les dictionnaires. Vous pouvez utiliser une alternative sérialiseur comme Json.NET (que je recommande vivement) ou JavaScriptSerializer (je pense qu'il a été dépréciée en faveur de DataContractJsonSerializer mais il va travailler pour votre scénario).
Vous pouvez également lire les ces coups de gueule.
Documentation: La Sérialisation Des Collections - Json.NET
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/071f73bb-e141-4a68-ae61-05635382934f
Vérifier cet article -, il a résolu mon problème est presque parfaitement. J'ai dû modifier leur objet[] Type d'une chaîne, mais je suis seulement en utilisant des chaînes de caractères:string type de paires Clé/Valeur, donc pas de problèmes là-bas.