Json.NET序列化/反序列化嵌套字典

时间:2013-11-27 18:42:10

标签: c# json serialization json.net deserialization

我一直在研究这个问题,除了将我的字典改为KeyValuePair对象的集合之外,我还没能找到针对以下情况的任何解决方案。

我有一个非常简单的名为Client的模型,它有一个字典作为其中一个属性,最后我试图序列化和反序列化一个Dictionary模型。

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;

namespace Automation
{
public class Client
{
    public Client(IList<String> environments)
    {
        this.Environments = new Dictionary<String, Boolean>();
        if (environments != null)
            foreach (String environment in environments)
                this.Environments[environment] = false;
    }

    public Dictionary<String, Boolean> Environments { get; set; }
}

public static class TestClass
{
    public static void Serializer()
    {
        Dictionary<String, Client> newDict = new Dictionary<String, Client>();
        newDict[Guid.NewGuid().ToString()] = new Client(new List<String>() { "A", "B" });
        newDict[Guid.NewGuid().ToString()] = new Client(new List<String>() { "A", "B" });
        newDict[Guid.NewGuid().ToString()] = new Client(new List<String>() { "A", "B" });

        string json = JsonConvert.SerializeObject(newDict, Formatting.Indented);
        try
        {
            Dictionary<String, Client> obj = JsonConvert.DeserializeObject<Dictionary<String, Client>>(json);
        }
        catch
        {
        }
    }
}

}

这是生成的json:

{
"246af598-89b3-4198-b2cb-9f2d8fe6e03e": {
"Environments": {
  "A": false,
  "B": false
  }
},
"fc43bb8d-65d3-4a97-86f3-cb67567845bd": {
"Environments": {
  "A": false,
  "B": false
   }
},
"90c0158a-69e2-42b0-9072-e695c94a2f7a": {
"Environments": {
  "A": false,
  "B": false
   }
 }
}

这是我在尝试反序列化时遇到的异常:

  

无法将当前JSON对象(例如{“name”:“value”})反序列化为类型'System.Collections.Generic.IList`1 [System.String]',因为该类型需要JSON数组(例如[1] ,2,3])正确反序列化。   要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。   Path'246af598-89b3-4198-b2cb-9f2d8fe6e03e.Environments.A',第4行,第11位。

任何想法,最终我将通过SignalR请求通过网络串行发送此对象。

谢谢

1 个答案:

答案 0 :(得分:1)

只需为解串器使用默认构造函数:

public class Client
{
    public Client()
    { }

    // your other constructor ...
}