【问题标题】:Deserialise JSON with Newtonsoft Json.NET in C#在 C# 中使用 Newtonsoft Json.NET 反序列化 JSON
【发布时间】:2015-04-26 07:09:16
【问题描述】:

我想用 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"})才能正确反序列化。

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

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

【问题讨论】:

    标签: c# json json.net


    【解决方案1】:

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

    你的班级应该是这样的:

    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&lt;Account&gt;,而不是一个。反序列化时,您需要:

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

    【讨论】:

    • 我的回复与@YuvalItzchakov 相同,而他的更准确。
    • @SajjadZare 我已经测试了这段代码,它可以工作。你确定你运行的是正确的代码吗?
    • @SajjadZare 你只复制并粘贴了我的代码。我不跟着你。我已经运行了这段代码,它工作正常。您是否仍然遇到同样的错误?
    • 发布的 JSON 是 Account 对象的数组,所以问题也在反序列化调用中。
    • @SajjadZare 我的答案有一个粗体的“编辑”。看看吧。
    【解决方案2】:

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

    试试:

    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
    

    【讨论】:

    • 如果您将value 声明为int,您将截断任何小数点。
    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多