bbr*_*own 22 c# wcf serialization json dictionary
我有以下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:"
}]
Run Code Online (Sandbox Code Playgroud)
所有在一个行版本(适用于字符串文字):
[{\"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:\"}]
Run Code Online (Sandbox Code Playgroud)
在上述例子中,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; }
}
}
Run Code Online (Sandbox Code Playgroud)
这是我用来反序列化的代码:
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();
Run Code Online (Sandbox Code Playgroud)
一切顺利,除了那个,items并且第一遍rules是空的FooDef.我已经在阳光下想尽一切办法试图让他们填充:自定义类,NameValueCollection,KeyValuePair<string, string>,List无论是后者的,和所有其他的集合,似乎适用.[编辑:我忘了尝试Hashtable,这似乎是一个明显的候选人.没工作.]
这个问题,在我看来,是在关键件items和rules是开放式的.也就是说,它并不总是被称为range或3.有什么建议或想法吗?
Dar*_*rov 22
恕我直言,没有办法使用DataContractJsonSerializer反序列化您提供给.NET类的JSON字符串.
问题来自DataContractJsonSerializer序列化字典的方式.您可以使用替代的序列化程序,如Json.NET(我强烈推荐)或JavaScriptSerializer(我认为它已被弃用,而不是DataContractJsonSerializer,但它适用于您的场景).
小智 7
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/071f73bb-e141-4a68-ae61-05635382934f
看看这篇文章 - 它几乎完美地解决了我的问题.我不得不将他们的对象[]类型更改为字符串,但我只使用字符串:字符串类型键/值对,所以没有问题.
| 归档时间: |
|
| 查看次数: |
55336 次 |
| 最近记录: |