Десериализация объекта JSON с неизвестными полями

Вопрос похож на десериализацию JSON с неизвестными полями, но я бы хотел использовать вместо этого встроенный DataContractJsonSerializer.

Итак, у меня есть данные в формате JSON:

{
"known1": "foo",
"known2": "bar",
"more":{ "unknown12345": { "text": "foo", "label": "bar"},
         "unknown67890": { "text": "foo","label":"bar"}
       }
}

Я думал, что смогу сделать так,

 [DataMember(Name = "known1")]
        public string K1 { get;  set;  }
 [DataMember(Name = "known2")]
        public string K2 { get;  set;  }
 [DataMember(Name = "more")]
        public Dictionary<string,TwoStringMembersClass> More {   get; set;  }

И TwoStringMembersClass как раз это:

 [DataContract(Name = "TwoStringMembersClass ")]
    public class TwoStringMembersClass 
    {
        [DataMember(Name = "text")]
        public string Text { get;  set; }

        [DataMember(Name = "label")]
        public string Label {  get;  set; }
    }

Но то, что работает в JSON.Net, кажется, не так просто с нативным анализатором JSON. В ReadObject() я получаю ArgumentException, вероятно, из-за словаря.

Любая идея, что является лучшим решением, как сделать эту работу?

Заранее спасибо.

1 ответ

Решение

DataContractJsonSerializer не поддерживает десериализацию Dictionary<TKey, TValue> из нотации объекта в JSON. Он поддерживает только словарь как массив. Следовательно, JSON, необходимый для десериализации определенных вами типов, должен выглядеть следующим образом:

{
    "known1": "foo",
    "known2": "bar",
    "more":[{ "Key": "unknown12345", "Value": { "text": "foo", "label": "bar"} },
            { "Key": "unknown67890", "Value": { "text": "foo","label":"bar"} }
           ]
}

Если схема входящего JSON не может быть изменена, вы не сможете использовать DataContractJsonSerializer,

Другие вопросы по тегам