使用未知字段反序列化JSON对象

时间:2011-11-09 11:54:55

标签: json silverlight windows-phone-7 datacontractjsonserializer

问题类似于Deserializing JSON with unknown fields,但我想使用内置的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解析器似乎在JSON.Net中起作用似乎并不那么容易。在ReadObject()中,我得到一个ArgumentException,可能是因为Dictionary。

知道如何使这项工作成为最佳解决方案吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

DataContractJsonSerializer不支持从JSON中的对象表示法反序列化Dictionary<TKey, TValue>。它仅支持将字典视为数组。因此,反序列化到您定义的类型所需的JSON应如下所示: -

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

如果传入的JSON的架构无法更改,那么您将无法使用DataContractJsonSerializer