C# DataContractJsonSerializer的反序列化问题

C# DataContractJsonSerializer的反序列化问题,c#,wcf,json,dictionary,serialization,C#,Wcf,Json,Dictionary,Serialization,我得到了以下JSON片段: [{ "name": "numToRetrieve", "value": "3", "label": "Number of items to retrieve:", "items": { "1": "1", "3": "3", "5": "5" }, "rules": { "range": "1-2" } }, { "name": "show

我得到了以下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:"
}]
多行版本(适用于字符串文字):

在上述示例中,
名称
标签
是必需的,但
项目
规则
是可选的

下面是我试图反序列化到的类:

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; }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用System.Runtime.Serialization;
名称空间foooo
{
[数据合同]
公共密封等级
{
[数据成员(Name=“Name”,IsRequired=true)]
公共字符串名称{get;set;}
[数据成员(Name=“value”,IsRequired=true)]
公共字符串值{get;set;}
[数据成员(Name=“label”,IsRequired=true)]
公共字符串标签{get;set;}
[DataMember(Name=“items”,IsRequired=false)]
公共字典项{get;set;}
[DataMember(Name=“rules”,IsRequired=false)]
公共字典规则{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();
var json=newdatacontractjsonserializer(typeof(List));
目前,该公司的标签标签为:目前检索的项目数为:检索的项目数为:除除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了以外以外以外以外以外以外以外以外以外以外的以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外的以外以外以外以外的以外的以外以外的以外以外的以外以外以外以外以外以外的以外以外以外以外以外的以外以外的以外以外的其他除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了\“:\“foo:\”}]”;
var stream=newmemoryStream(Encoding.UTF8.GetBytes(bar));
var foo=json.ReadObject(流);
stream.Close();
除了第一次通过
FooDef
项目和
规则都是空的之外,一切都进行得相当顺利。我尝试了所有方法来填充它们:自定义类、
NameValueCollection
KeyValuePair
List
,以及所有其他似乎适用的集合。[编辑:我忘了尝试
哈希表
,它似乎是一个明显的候选者。不起作用。]


在我看来,问题在于
项目
规则
下的关键部分是开放的。也就是说,它并不总是被称为
range
3
。有什么建议或想法吗?

IMHO无法使用DataContractJsonSerializer将您提供的JSON字符串反序列化到.NET类中

问题来自于序列化词典的方式。您可以使用其他序列化程序,如(我强烈推荐)或(我认为DataContractJsonSerializer已被弃用,但它适用于您的场景)

你也可以阅读

文档:


看看这篇文章——它几乎完美地解决了我的问题。我不得不将它们的object[]类型更改为string,但我只使用strings:string-Type键/值对,所以没有问题。

这正是我所担心的。由于不赞成,我一直避免切换到JavaScriptSerializer,但我很高兴听到它在3.5SP1中未被预先定义。我将使用该类进行尝试。我使用JavaScriptSerializer进行了尝试,效果非常好。我最终使用了字典,但哈希表也起了作用。
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();