所以我使用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
似乎导致了我的问题。
以下是我尝试过的事情:
province_id
类型更改为字符串,但仍然出错。 List<RajaOngkirStateList> States
更改为Dictionary<string, RajaOngkirStateList>
,但仍然是错误。我得到的错误:
无法将当前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位。
答案 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
,因为它不是列表,但这是一个单独的事情。