无法仅使用一个结果反序列化当前JSON对象

时间:2015-01-11 21:28:42

标签: c# 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"
        }
    }
}

我的问题是如何解决这个问题的最佳做法是什么?

2 个答案:

答案 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循环通过它并将项目添加到列表中,如果没有生病,则获取对象的值。