簡體   English   中英

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

[英]Json.NET serializing/ deserializing nested dictionaries

我一直在對該主題進行一些研究,除了將我的Dictionary更改為KeyValuePair對象的Collection之外,我無法找到以下情況的任何解決方案。

我有一個稱為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對象反序列化。 還可以將JsonObjectAttribute添加到類型中,以強制其從JSON對象反序列化。 路徑'246af598-89b3-4198-b2cb-9f2d8fe6e03e.Environments.A',第4行,位置11。

任何想法,最終我都會通過SignalR請求通過有線方式發送此對象。

謝謝

只需為反序列化器引入默認的構造函數即可:

public class Client
{
    public Client()
    { }

    // your other constructor ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM