[英]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.