无法反序列化只有一个结果的当前 JSON 对象
本文关键字:JSON 对象 结果 反序列化 有一个 | 更新日期: 2023-09-27 18:37:12
所以我看到这个错误消息很多。我面临的问题是,在我的 api 结果上,我是否收到此错误。当我只有 1 个结果时会发生这种情况(不确定根本没有结果时会发生什么)。我使用一个 API 并根据搜索查询给我一个 JSON 结果,如下所示:
{
"Cities": {
"@size": "6",
"City": [
{
"city": "Londern"
},
{
"city": "Amsterdam"
},
{
"city": "New York"
},
{
"city": "Rome"
},
{
"city": "Paris"
},
{
"city": "Berlin"
}
]
}
}
我的类如下所示(简体):
public class Cities
{
public string size { get; set; }
public List<City> City{ get; set; }
}
public class City
{
public string City{ get; set; }
}
public class CitiesWrapper
{
public Cities Cities { get; set; }
}
现在我有以下代码要反序列化:
dynamic result = JsonConvert.DeserializeObject<CitiesWrapper>(await task.Content.ReadAsStringAsync());
当 api 给我一个结果时,这就是出错的地方。我注意到的是 json 结果不再是数组。它变成这样:
{
"Cities": {
"@size": "1",
"City": {
"city": "Amsterdam area"
}
}
}
我的问题是,如何解决这个问题的最佳实践是什么?
您可以使用
JObject
并根据 JSON 的大小反序列化为正确的类型:
var parsedJson = JObject.Parse(json);
if (parsedJson["Cities"]["@size"].Value<string>() == "1")
{
CityClass city = parsedJson["Cities"]["City"].ToObject<CityClass>();
}
else
{
CityClass[] cities = parsedJson["Cities"]["City"].ToObject<CityClass[]>();
}
在此示例中,我使用了以下模型:
public class CityClass
{
public string City { get; set; }
}
显然,这是在服务器端处理JSON的绝对可怕的方式。将属性定义为数组时,即使有一个元素,也应遵循正确的数据类型。因此,您应该绝对修复您的 API,使其更加一致,并且不会根据结果修改City
类型,而不是像这样进行黑客攻击。以这种方式设计 API 是一种绝对可恶的方式。
因此,基于达林的回答和更多的挖掘,我得出了不同的方法。我用以下内容转换 Json 对象: dynamic result = JsonConvert.DeserializeObject(json);
在此之后,我会进行检查以查看它是 JObject 还是 JArray( if(result.Cities is JArray)
)。如果它是一个数组 ill 循环通过它并将项目添加到列表中,如果不是 ill,则取对象的值。