使用C#中的Newtonsoft Json.NET反序列化JSON

时间:2015-04-26 07:09:17

标签: c# json json.net

我想用Newtonsoft Json.NET解析一段JSON

JSON

[{
"type": "switchStatus",
"Data" :[
            { 
            "ID" : "1",
            "value" : "2.5"
        },
        { 
            "ID" : "2",
            "value" : "4.2"
        }
    ],
"Datetime": "2014-12-01",
"customerID": "50"
}]

类:

public class Account
{
    [JsonProperty("type")]
    public string Type { get; set; }
    public List<Data> Data { get; set; }
    [JsonProperty("Datetime")]
    public string DateTime { get; set; }
    [JsonProperty("customerID")]
    public string CustomerId { get; set; }
}//Account

public class Data
{
    [JsonProperty("ID")]
    public string Id { get; set; }
    [JsonProperty("value")]
    public string Value { get; set; }
}

解析:

Account account = JsonConvert.DeserializeObject<Account>(message);

错误:

  

无法将当前JSON数组(例如[1,2,3])反序列化为类型“JSonParser.Account”,因为该类型需要JSON对象(例如{“name”:“value”})才能正确反序列化。 / p>      

要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList)可以从JSON数组反序列化的列表。 JsonArrayAttribute也可以添加到类型中,以强制它从JSON数组反序列化。

     

路径'',第1行,第1位。

2 个答案:

答案 0 :(得分:5)

您的问题是您的JSON与您声明的类不匹配。具体来说,您的Data属性不是List<string>,它是一个复杂的对象。

你的课应该是这样的:

public class Data
{
    [JsonProperty("ID")]
    public int Id { get; set; }
    [JsonProperty("value")]
    public double Value { get; set; }
}

public class Account
{
    [JsonProperty("type")]
    public string Type { get; set; }
    public List<Data> Data { get; set; }
    [JsonProperty("Datetime")]
    public string DateTime { get; set; }
    [JsonProperty("customerID")]
    public int CustomerId { get; set; }
}

修改

当您编辑JSON时,现在很清楚您需要一个List<Account>,而不是一个。{1}}。反序列化时,您需要:

List<Account> accounts = JsonConvert.DeserializeObject<List<Account>>(message);

答案 1 :(得分:1)

您不能像这样反序列化数据数据属性。由于列表不是一个开头的字符串。

尝试:

public class Data
{
    public int ID { get; set; }
    public float value { get; set; }
}//Data

public class Account
{
    public string type { get; set; }
    public List<Data> Data { get; set; }
    public string Datetime { get; set; }
    public string customerID { get; set; }
}//Account