无法反序列化只有一个结果的当前 JSON 对象



所以我看到这个错误消息很多。我面临的问题是,在我的 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,则取对象的值。

最新更新