【发布时间】:2018-11-24 13:01:27
【问题描述】:
目前,当我尝试使用 反序列化从 第 3 方(--> 我无法自己更改接收到的 json 字符串)的 json 字符串时,我遇到了以下问题>Newtonsoft.Json:
json 包含一个字典(以及一些我没有在此处列出的其他条目):
"food": {
"Menu 1": "abc",
"Menu 2": "def"
}
我创建了一个包含该属性的类(以及我未在此处列出的属性):
Dictionary<string, string> Food {get; set;}
在这种情况下,json 的去理想化工作正常。 食物空了时会出现问题:
{
"food": [],
}
在这种情况下,食物似乎不是字典而是数组。 这就是反序列化失败并出现以下错误的原因:
Newtonsoft.Json.JsonSerializationException:“无法反序列化 当前 JSON 数组(例如 [1,2,3])转换为类型 'System.Collections.Generic.Dictionary`2[System.String,System.String]' 因为该类型需要一个 JSON 对象(例如 {"name":"value"}) 正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为 实现集合接口的数组或类型(例如 ICollection, IList) 之类的可以从 JSON 反序列化的 List 大批。 JsonArrayAttribute 也可以添加到类型中以强制它 从 JSON 数组反序列化。路径‘食物’。”
请问有谁可以帮我解决这个问题吗?
编辑 去离子化代码:
public T DeserializeAPIResults<T>(string json)
{
JObject obj = JsonConvert.DeserializeObject<JObject>(json);
return obj.GetValue("canteen").ToObject<T>();
}
编辑 2 带值的完整 json:
{
"canteen": [
{
"name": "Canteen1",
"src": "a link",
"food": {
"Menu 1": "abc",
"Menu 2": "def",
"Menu 3": "ghi",
"Menu 4": "jkl",
"Menu 5": "mno"
}
},
{
"name": "Canteen2",
"src": "a link",
"food": {
"Menu 1": "abc",
"Menu 2": "def",
"Menu 3": "ghi"
}
},
{
"name": "Canteen3",
"src": "a link",
"food": {
"Line 1": "abc",
"Line 2": "def",
"Line 3": "ghi"
}
}
]
}
没有值的完整 json:
{
"canteen": [
{
"name": "Canteen1",
"src": "a link",
"food": [],
},
{
"name": "Canteen2",
"src": "a link",
"food": [],
},
{
"name": "Canteen3",
"src": "a link",
"food": [],
}
]
}
编辑 3 班级:
public sealed class Canteen
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("src")]
public string Src { get; set; }
[JsonProperty("food")]
public Dictionary<string, string> Food { get; set; }
public Canteen() { }
}
以及方法调用:
Canteen[] canteens = DeserializeAPIResults<Canteen[]>(json);
【问题讨论】:
-
表示您的
food键包含 sometime 对象和 sometime 数组,对吗? -
好像。当食物不空时,它总是一本字典。只有当它为空时,它才会被视为一个数组。
-
给我看看你的反序列化代码?
-
我已经添加了反序列化代码
-
@er-shoaib - 他说当食物为空时它会像空数组一样返回,但当它不为空时它的字典。