Newtonsoft JSON反序列化问题[将值转换为类型时出错]

时间:2016-12-21 21:53:31

标签: c# json web-services rest json.net

使用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库以来已经有一段时间了,所以我在这里可能会遇到什么问题。

2 个答案:

答案 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。

Attaching Screenshot

答案 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
           })
};