C#无法使用数组反序列化复杂的Json对象

时间:2017-10-25 05:22:22

标签: c# json

所以我使用HttpClient()从web api获取Json对象。该对象包含一个国家/地区中所有省份的列表。

此代码调用json反序列化:

rj = JsonConvert.DeserializeObject<RajaOngkirCity>(response);

响应是这样的:

{
    "rajaongkir": {
        "query": {
            "key": "xxxxxxxxxxxxxxxxxxxxx"
        },
        "status": {
            "code": 200,
            "description": "OK"
        },
        "results": [{
                "province_id": "1",
                "province": "Bali"
            },
            {
                "province_id": "2",
                "province": "Bangka Belitung"
            },
        .....]
    }
}

这些是我的课程:

public class RajaOngkirState
{
    [JsonProperty("rajaongkir")]
    public RajaOngkirStateResult RajaOngkir { get; set; }
}

public class RajaOngkirStateResult
{
    [JsonProperty("query")]
    public RajaOngkirStateQuery StateQuery { get; set; }

    [JsonProperty("status")]
    public RajaOngkirStateStatus Status { get; set; }

    [JsonProperty("results")]
    public RajaOngkirStateResults Results { get; set; }
}

public class RajaOngkirStateQuery
{
    [JsonProperty("key")]
    public string Key { get; set; }
}

public class RajaOngkirStateStatus
{
    [JsonProperty("code")]
    public int Code { get; set; }
    [JsonProperty("description")]
    public string Description { get; set; }
}

public class RajaOngkirStateResults
{
    public List<RajaOngkirStateList> States { get; set; }
}

public class RajaOngkirStateList
{
    [JsonProperty("province_id")]
    public int ProvinceId { get; set; }
    [JsonProperty("province")]
    public string Province { get; set; }
}

rajaongkir.results似乎导致了我的问题。

以下是我尝试过的事情:

  1. 我尝试将province_id类型更改为字符串,但仍然出错。
  2. 我尝试将List<RajaOngkirStateList> States更改为Dictionary<string, RajaOngkirStateList>,但仍然是错误。
  3. 我得到的错误:

      

    无法将当前JSON数组(例如[1,2,3])反序列化为类型&#39; ECommerce.ShippingMethod.RajaOngkir.RajaOngkirStateResults&#39;因为类型需要JSON对象(例如{&#34; name&#34;:&#34; value&#34;})才能正确反序列化。   要修复此错误,请将JSON更改为JSON对象(例如{&#34; name&#34;:&#34; value&#34;})或将反序列化类型更改为实现集合接口的数组或类型(例如ICollection,IList)就像可以从JSON数组反序列化的List。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。   路径&#39; rajaongkir.results&#39;,第1行,第118位。

1 个答案:

答案 0 :(得分:7)

目前,您的Results属性声称是包含数组的对象 - 就像您的JSON看起来像这样:

"results": {
    states: [{
              "province_id": "1",
              "province": "Bali"
            },
            {
              "province_id": "2",
              "province": "Bangka Belitung"
            }
    ]}

相反,JSON 中的results属性列表。

所以您需要做的就是完全删除RajaOngkirStateResults类,并将Results属性更改为:

[JsonProperty("results")]
public List<RajaOngkirStateList> Results { get; set; }

我个人将RajaOngkirStateList重命名为RajaOngkirState,因为它不是列表,但这是一个单独的事情。