1

该问题类似于Deserializing JSON with unknown fields,但我想使用内置的DataContractJsonSerializer代替。反序列化具有未知字段的JSON对象

所以我JSON数据这样的:

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

我想我能做到这样的datacontract:

[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,可能是因为字典。

任何想法如何使这项工作最好的解决方案是什么?

在此先感谢。

+0

你可以发布TwoStringMembersClass的定义。您可能还想查看它是否可以与Dictionary 一起使用。 – calum

+0

@calum现在提供了TwoStringMembersClass ....还有Dictionary 引发了相同的异常:-( – Marco

回答

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

+0

我很担心,谢谢,还有可能在你自己的支持下构建解析器内置在xml/json解析器中,但它更加复杂。请参阅此博客条目中的详细信息:http://mutelight.org/articles/using-the-little-known-built-in-net-json-parser – Marco

+0

@sav :如果我想用我的一个代码尝试序列化,那么我会使用Silverlight特定的'System.Json'命名空间和LINQ扩展方法,这可能非常有效并且令人惊讶地很短。 – AnthonyWJones