一尘不染

DataContractJsonSerializer的反序列化问题

json

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

在上述例子中,namevalue,和label被需要的,但是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<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通过时都是空的。我曾尝试一切在阳光下,试图让他们填充:自定义类,NameValueCollectionKeyValuePair<string, string>List无论是后者,和所有其他的集合,似乎适用的。[编辑:我忘记尝试了Hashtable,这似乎是显而易见的候选人。没用。]

这个问题,在我看来,是在关键件itemsrules是开放式的。也就是说,它并不总是被称为rangeor 3。有什么建议或想法吗?


阅读 302

收藏
2020-07-27

共1个答案

一尘不染

恕我直言,无法使用DataContractJsonSerializer将提供的JSON字符串反序列化为.NET类。

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

您还可以阅读这些 言论

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

2020-07-27