DataContractJsonSerializer的反序列化问题

我有以下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:" }] 

所有在一个行版本(适用于字符串文字):

 [{\"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:\"}] 

在上面的示例中, namevaluelabel是必需的,但itemsrules是可选的。

这是我试图反序列化的类:

 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 Items { get; set; } [DataMember(Name = "rules", IsRequired = false)] public Dictionary Rules { get; set; } } } 

这是我用来反序列化的代码:

 var json = new DataContractJsonSerializer(typeof(List)); 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(); 

除了第一个FooDef传递的itemsrules是空的以外,一切都相当顺利。 我已尝试在阳光下尝试并填充它们:自定义类, NameValueCollectionKeyValuePair ,后者的List以及似乎适用的所有其他集合。 [编辑:我忘了尝试Hashtable ,这似乎是一个明显的候选人。 没工作。]

正如我所看到的,问题在于itemsrules下的关键部分是开放式的。 也就是说,它并不总是被称为range3 。 有什么建议或想法吗?

恕我直言,没有办法使用DataContractJsonSerializer反序列化您提供给.NET类的JSON字符串。

问题来自DataContractJsonSerializer序列化字典的方式。 您可以使用替代的序列化程序,如Json.NET (我强烈推荐)或JavaScriptSerializer (我认为它已被弃用,而不是DataContractJsonSerializer,但它适用于您的场景)。

你也可以阅读这些 咆哮 。

文档: 序列化集合 – Json.NET

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/071f73bb-e141-4a68-ae61-05635382934f

看看这篇文章 – 它几乎完美地解决了我的问题。 我不得不将他们的对象[]类型更改为字符串,但我只使用字符串:字符串类型键/值对,所以没有问题。