所以我已经看到了这个错误信息。我面临的问题是,对我的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"
}
}
}
我的问题是如何解决这个问题的最佳做法是什么?
答案 0 :(得分:1)
您可以使用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是一种绝对可恶的方式。
答案 1 :(得分:0)
因此,基于达林的答案和更多的挖掘,我采用了不同的方法。在我构建一个检查以查看它是JObject还是JArray(dynamic result = JsonConvert.DeserializeObject(json);
)之后,我用if(result.Cities is JArray)
转换Json对象。如果它是一个数组ill循环通过它并将项目添加到列表中,如果没有生病,则获取对象的值。