我有以下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:\"}]
在上述例子中,name,value,和label被需要的,但是items和rules是可选的。
name
value
label
items
rules
这是我要反序列化的课程:
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; } } }
这是我用来反序列化的代码:
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();
除此以外,一切都进行得相当顺利,items并且rules第一次FooDef通过时都是空的。我曾尝试一切在阳光下,试图让他们填充:自定义类,NameValueCollection,KeyValuePair<string, string>,List无论是后者,和所有其他的集合,似乎适用的。[编辑:我忘记尝试了Hashtable,这似乎是显而易见的候选人。没用。]
FooDef
NameValueCollection
KeyValuePair<string, string>
List
Hashtable
这个问题,在我看来,是在关键件items和rules是开放式的。也就是说,它并不总是被称为rangeor 3。有什么建议或想法吗?
range
3
恕我直言,无法使用DataContractJsonSerializer将提供的JSON字符串反序列化为.NET类。
问题来自DataContractJsonSerializer序列化字典的方式。您可以使用替代的序列化程序,例如Json.NET(强烈推荐)或JavaScriptSerializer(我认为不建议使用该序列化程序,而推荐使用DataContractJsonSerializer,但它适用于您的方案)。
您还可以阅读这些 言论。
文档: 序列化集合- Json.NET