簡體   English   中英

如何使用Newtonsoft從我的JSON數組反序列化為其值是C#.NET中“資源”對象的字典數組?

[英]How to deserialize from my JSON array to an array of dictionaries whose values are my “Resource” objects in C# .NET using Newtonsoft?

嘗試將JSON反序列化為Dictionary<string, Resources>[]時出現以下錯誤:

Newtonsoft.Json.dll中發生了類型為'Newtonsoft.Json.JsonSerializationException'的未處理異常

附加信息:無法將當前JSON對象(例如{“ name”:“ value”})反序列化為類型'System.Collections.Generic.Dictionary`2 [System.String,MyProject.Resource] []',因為該類型需要JSON數組(例如[1,2,3])可正確反序列化。

要解決此錯誤,可以將JSON更改為JSON數組(例如[1,2,3]),也可以更改反序列化類型,使其成為普通的.NET類型(例如,不像整數這樣的原始類型,也不像這樣的集合類型)數組或列表),可以從JSON對象反序列化。 還可以將JsonObjectAttribute添加到類型中,以強制其從JSON對象反序列化。

我的Program.Main():

    public class Program
            {
                public static void Main(string[] Args)
                {
                    var options = new Options()
                    {
                        Option1 = "foo",
                        Option2 = "bar",
                        Resources = JsonConvert.DeserializeObject<Dictionary<string, Resource>[]>(resources.json)
                    };
                }
            }

我的resources.json:

{
    "global": [

        {
            "title": "global1",
            "url": "~/global1"
        },
        {
            "title": "global2",
            "url": "~/global2"
        }
    ],
    "ACC": [
        {
            "title": "acc1",
            "url": "~/acc1/"
        },
        {
            "title": "acc2",
            "url": "~/acc2/"
        }
    ],
    "ECC": [
        {
            "title": "ecc1",
            "url": "~/ecc1/"
        },
        {
            "title": "ecc2",
            "url": "~/ecc2/"
        }
    ],
    "ECB": [
        {
            "title": "ecb1",
            "url": "~/ecb1"
        }
    ]

}

我的資源班:

public class Resource
    {
        public List<string> titles { get; set; }

        public List<string> urls { get; set; }
    }

我的選項類別:

public class Options
    {
        public string Option1 { get; set; }
        public string Option2 { get; set; }
        public Dictionary<string, Resource>[] Resources { get; set; }
    }

您的Json與您的類結構不匹配。
如果要保持類結構,則json必須如下所示:

{
   "global":{
      "titles":[
         "global1",
         "global2"
      ],
      "urls":[
         "~/global1",
         "~/global2"
      ]
   },
   "acc":{
      "titles":[
         "acc1",
         "acc2"
      ],
      "urls":[
         "~/acc1",
         "~/acc2"
      ]
   },

   ...    

}

如果您無法影響json文件(無論出於何種原因),您的類結構必須如下所示:

public class Rootobject
{
   public Global[] global { get; set; }
   public ACC[] ACC { get; set; }
   public ECC[] ECC { get; set; }
   public ECB[] ECB { get; set; }
}

public class Global
{
   public string title { get; set; }
   public string url { get; set; }
}

public class ACC
{
   public string title { get; set; }
   public string url { get; set; }
}

public class ECC
{
   public string title { get; set; }
   public string url { get; set; }
}

public class ECB
{
   public string title { get; set; }
   public string url { get; set; }
}

然后,您可以像這樣反序列化它:

Resources = JsonConvert.DeserializeObject<Rootobject>(resources.json)

下次需要注意的一點:
如果不確定類結構的樣子(關於json字符串),則可以復制json字符串並轉到:

Visual Studio->編輯->選擇性粘貼->將JSON作為類粘貼

Visual Studio將組成適當的類結構。

您的JSON不代表字典的數組( Dictionary<string, Resource>[] ),而是代表數組的字典( Dictionary<string, Resource[]> )。 這就是為什么您得到錯誤。

另外,您的Resource類需要像這樣定義以匹配JSON:

public class Resource
{
    public string Title { get; set; }
    public string Url { get; set; }
}

然后,您可以像這樣反序列化:

 Resources = JsonConvert.DeserializeObject<Dictionary<string, Resource[]>>(resources.json)

在這里查看小提琴: https//dotnetfiddle.net/8s2eQd

暫無
暫無

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

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