C#反序列化Dictionary <int,object>使用Json.NET失败

时间:2016-06-23 07:24:11

标签: c# json dictionary

我正在使用Newtonsoft Json.NET库进行序列化/反序列化。

我有问题反序列化具有 Dictionary&lt;属性的对象。整型,对象&gt; 即可。在字典中 - 对象可以是任何类型。

以下是我为测试所做的工作。

    [DataContract]
    public class MyClass
    {
        [DataMember(Order = 1)]
        public int ID { get; set; }

        [DataMember]
        public string Text { get; set; }

        [DataMember]
        public Dictionary<int,object> sub { get; set; }
    }
    [DataContract]
    public class MyClass2
    {
        [DataMember]
        public int ID2 { get; set; }
        [DataMember]
        public string Text2 { get; set; }
    }

点击按钮,点击简单的WPF应用程序。

        MyClass c = new MyClass() { ID = 1, Text = "Hello", sub = new Dictionary<int, object>() };

        MyClass2 c2 = new MyClass2() { ID2 = 2, Text2 = "sub1" };
        c.sub.Add(1, c2);

        MyClass2 c3 = new MyClass2() { ID2 = 3, Text2 = "sub2" };
        c.sub.Add(2, c3);

        string file = "c:\\newfile.txt";

        if (File.Exists(file))
            File.Delete(file);

        Newtonsoft.Json.JsonSerializer ser = new Newtonsoft.Json.JsonSerializer();

        File.WriteAllText(file, JsonConvert.SerializeObject(c));

        MyClass o = JsonConvert.DeserializeObject<MyClass>(File.ReadAllText(file));
    }

Serilaized Json String -

  

{ “文本”: “你好”, “子”:{ “1”:{ “ID2”:2 “文本2”: “SUB1”}, “2”:{ “ID2”:3“,文本2 “:” SUB2 “}},” ID“:1}

反序列化 - 解析了MyClass实例的属性,但属性Dictionary (sub)仍然没有解析为MyClass2的json字符串。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

要解决您的问题,您应该更改

   [DataMember]
   public Dictionary<int,object> sub { get; set; }

致:

   [DataMember]
   public Dictionary<int,MyClass2> sub { get; set; }

MyClass c = new MyClass() { ID = 1, Text = "Hello", sub = new Dictionary<int, object>() };

MyClass c = new MyClass() { ID = 1, Text = "Hello", sub = new Dictionary<int, MyClass2>() };

修改

要反序列化MyClass2,MyClassN ......您应该使用TypeNameHandling.All

MyClass o = JsonConvert.DeserializeObject<MyClass>(File.ReadAllText(file), new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All });

答案 1 :(得分:1)

无法反序列化对象。 Json.NET无法确定确切的类。