使用C#Newtownsoft JSON库......我遇到了这个问题。
设置舞台......
我从RESTful Web服务获得这个JSON:
[
{
"CorporateArea": "Brampton",
"ServiceAddress": "321 Heart Lake Road",
"VendorName": "Enbridge Gas Distribution Inc",
"MeterNumber": "502105",
"RateClass": "NG-R6",
"Department": "22603",
"Account": "12008",
"VendorID": "0000001195",
"MeterLevelID": 2882,
"SiteAddressID": 468,
"MappingLocation": "Beckett Sproule",
"ElectricalBilling": "",
"EnergyLine": "",
"CorporateGroup": "Public Works"
}
]
我也有这些C#类:
public class AccountInfo
{
[JsonProperty("Account")]
public string Account { get; set; }
[JsonProperty("CorporateArea")]
public string CorporateArea { get; set; }
[JsonProperty("CorporateGroup")]
public string CorporateGroup { get; set; }
[JsonProperty("Department")]
public string Department { get; set; }
[JsonProperty("ElectricalBilling")]
public string ElectricalBilling { get; set; }
[JsonProperty("EnergyLine")]
public string EnergyLine { get; set; }
[JsonProperty("MappingLocation")]
public string MappingLocation { get; set; }
[JsonProperty("MeterLevelID")]
public string MeterLevelID { get; set; }
[JsonProperty("MeterNumber")]
public string MeterNumber { get; set; }
[JsonProperty("RateClass")]
public string RateClass { get; set; }
[JsonProperty("ServiceAddress")]
public string ServiceAddress { get; set; }
[JsonProperty("SiteAddressID")]
public string SiteAddressID { get; set; }
[JsonProperty("VendorID")]
public string VendorID { get; set; }
[JsonProperty("VendorName")]
public string VendorName { get; set; }
}
public class JSONArray {
public IList<AccountInfo> AccountsInfo { get; set; }
}
通过这些,我称之为Newtownsoft方法:
JSONArray Accounts = JsonConvert.DeserializeObject<JSONArray> (responseBody,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
但每次我这样做,我都会得到异常Newtonsoft.Json.JsonSerializationException 错误消息:
转换价值时出错&#34; [{&#34; CorporateArea&#34;:&#34; Brampton&#34;,&#34; ServiceAddress&#34;:&#34; 321 Heart Lake Road&#34; ,&#34; VendorName&#34;:&#34; Enbridge Gas Distribution Inc&#34;,&#34; MeterNumber&#34;:&#34; 502105&#34;,&#34; RateClass&#34;:& #34; NG-R6&#34;&#34;部&#34;:&#34; 22603&#34;&#34;帐户&#34;:&#34; 12008&#34;&#34;厂商ID&#34;:&#34; 0000001195&#34;&#34; MeterLevelID&#34;:2882,&#34; SiteAddressID&#34;:468,&#34; MappingLocation&#34;:&#34;贝克特斯普劳尔&#34;&#34; ElectricalBilling&#34;:&#34;&#34;&#34; EnergyLine&#34;:&#34;&#34;&#34; CorporateGroup&#34 ;: &#34; Public Works&#34;}]&#34;输入&#39; TestWebService_Consume.JSONArray&#39;。路径&#39;&#39;,第1行,第421位。
我已经尝试弄乱JSON字符串,因此它不是一个数组,并将其转换为一个简单的AccountsInfo对象,它会返回相同的错误。
我一定做错了,但是自从我使用Newtonsoft JSON库以来已经有一段时间了,所以我在这里可能会遇到什么问题。
答案 0 :(得分:3)
JSON的反序列化输出是在尝试使用
时JSONArray Accounts = JsonConvert.DeserializeObject<JSONArray>(json, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
是
无法将当前JSON数组(例如[1,2,3])反序列化为类型'JustSO.JSONArray',因为该类型需要一个JSON对象(例如{\“name \”:\“value \”})来正确反序列化。要修复此错误,请将JSON更改为JSON对象(例如{\“name \”:\“value \”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList)像可以从JSON数组反序列化的List。 JsonArrayAttribute也可以添加到类型中,以强制它从JSON数组反序列化。
但如果你这样尝试
List<AccountInfo> lc = JsonConvert.DeserializeObject<List<AccountInfo>>(json, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
或
List<AccountInfo> lc = JsonConvert.DeserializeObject<List<AccountInfo>>(json);
会将结果json转换为Object。
答案 1 :(得分:1)
你的JSOn不是一个对象,而是一个对象数组,所以你不需要一个类来包装数组,你应该直接反序列化为数组:
var Accounts = JsonConvert.DeserializeObject<List<AccountInfo>>(responseBody,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
如果你真的想拥有JSONArray
对象,你可以创建它并序列化它的属性。要提一下:您的AccountInfo
属性是私有的,您应该将其更改为public以反序列化它。
JSONArray Accounts = new JSONArray
{
AccountsInfo = JsonConvert.DeserializeObject<List<AccountInfo>>(responseBody,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
})
};