反序列化不同对象类型的数组

10
使用Json.NET库时,我在反序列化返回的一些json数组时遇到了麻烦。该json是一个包含对象和国家对象数组的分页信息数组。以下是返回的json示例:
[
    {
        "page": 1,
        "pages": 6,
        "per_page": "50",
        "total": 262
    },
    [
        {
            "id": "ABW",
            "iso2Code": "AW",
            "name": "Aruba",
            "region": {
                "id": "LCN",
                "value": "Latin America & Caribbean (all income levels)"
            },
            "adminregion": {
                "id": "",
                "value": ""
            },
            "incomeLevel": {
                "id": "NOC",
                "value": "High income: nonOECD"
            },
            "lendingType": {
                "id": "LNX",
                "value": "Not classified"
            },
            "capitalCity": "Oranjestad",
            "longitude": "-70.0167",
            "latitude": "12.5167"
        }
    ]
]

我正在尝试将以下类型反序列化:
class CountriesQueryResults
{
    public PagingInfo PageInfo { get; set; }
    public List<CountryInfo> Countries { get; set; }
}

class PagingInfo
{
    public int Page { get; set; }
    public int Pages { get; set; }
    [JsonProperty("per_page")]  
    public int ResultsPerPage { get; set; }
    public int Total { get; set; }
}

class CountryInfo
{
    public string Id { get; set; }
    public string Iso2Code { get; set; }
    public string Name { get; set; }
    public string Longitude { get; set; }
    public string Latitude { get; set; }
    public string CapitalCity { get; set; }
    public CompactIdentifier Region { get; set; }
    public CompactIdentifier AdminRegion { get; set; }
    public CompactIdentifier IncomeLevel { get; set; }
    public CompactIdentifier LendingType { get; set; }  
}

class CompactIdentifier
{
    public string Id { get; set; }
    public string Value { get; set; }
}

我这样调用DeserializeObject:
var data = JsonConvert.DeserializeObject<List<CountriesQueryResults>>(response);

我遇到了以下错误:
无法将当前的JSON对象(例如{"name":"value"})反序列化为类型“CountriesQueryResults”,因为该类型需要一个JSON数组(例如[1,2,3])才能正确反序列化。
我一直在尝试从文档中获取答案,但似乎无法找到解决方法。任何帮助都将不胜感激。

https://dev59.com/0WMl5IYBdhLWcg3wsIyA#18192564 - SwDevMan81
1个回答

12

由于您的JSON格式如下:[ {....} , [{....}] ],因此您只能将其反序列化为对象数组(其中第一个项目是对象,第二个项目是另一个数组)。

我认为将其转换为C#对象的最简单方法是:

var jArr = JArray.Parse(jsonstr);
var pageInfo = jArr[0].ToObject<PagingInfo>();
var countryInfos = jArr[1].ToObject<List<CountryInfo>>();

类的定义将如下所示:

public class PagingInfo
{
    public int page { get; set; }
    public int pages { get; set; }
    [JsonProperty("per_page")]
    public int ResultsPerPage { get; set; }
    public int total { get; set; }
}

public class Region
{
    public string id { get; set; }
    public string value { get; set; }
}

public class AdminRegion
{
    public string id { get; set; }
    public string value { get; set; }
}

public class IncomeLevel
{
    public string id { get; set; }
    public string value { get; set; }
}

public class LendingType
{
    public string id { get; set; }
    public string value { get; set; }
}

public class CountryInfo
{
    public string id { get; set; }
    public string iso2Code { get; set; }
    public string name { get; set; }
    public Region region { get; set; }
    public AdminRegion adminregion { get; set; }
    public IncomeLevel incomeLevel { get; set; }
    public LendingType lendingType { get; set; }
    public string capitalCity { get; set; }
    public string longitude { get; set; }
    public string latitude { get; set; }
}

PS:如果您希望,可以将属性名称的第一个字符更改为大写。我使用http://json2csharp.com/自动生成这些类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接