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?

InformationsquelleAutor bbrown | 2009-02-27