在 C# 中反序列化 JSON 集合

本文关键字:JSON 集合 反序列化 | 更新日期: 2023-09-27 18:35:39

这是我从服务器收到的JSON消息(我无法更改)。可能返回了更多对象(时间/值),但在本例中只有一个。无论如何,格式保持不变。

{
  "data": [
    {
      "time": "2014-12-12T13:52:43",
      "value": 255.0
    }
  ]
}

我正在尝试将 JSON 反序列化为一个非常简单的 C# 对象。

public class Dataentry {
    public float Value { get; set; }
    public DateTime Time { get; set; }
}

我尝试过使用Newtonsoft的 JSON.Net 和RestSharp库进行反序列化,但没有成功。以下代码不起作用,但我尝试过的其他任何代码也不起作用:-)我没有收到任何错误 - 只是一个具有默认初始值的空对象。

var myObject = JsonConvert.DeserializeObject<Dataentry> (jsonString);

由于这些库在这种情况下不是很直观或文档齐全,所以我迷路了。这种 JSON 无法反序列化吗?我真的很想使用现成的库,所以任何帮助将不胜感激。

在 C# 中反序列化 JSON 集合

这是行不通的,因为您的 JSON 正在指定一个集合,并且您正在尝试解冻成一个对象。 有很多 json 到 c# 类生成器,您可以将 json 粘贴到其中以获得适当的类定义,其中一个这样的生成器位于此处

更合适的定义是

public class Datum
{
    public string time { get; set; }
    public double value { get; set; }
}
public class RootObject
{
    public List<Datum> data { get; set; }
}

然后去

var myObject = JsonConvert.DeserializeObject<RootObject> (jsonString);
我想

在你的问题中添加一些额外的解释......

你写道,我正在尝试将 JSON 反序列化为一个非常简单的 C# 对象。 - 不幸的是,这不是完整的事实。您正在尝试的是反序列化非常简单的 C# 对象的集合。此指示器是 json 中的方括号:

{
  "data": [
    {
      "time": "2014-12-12T13:52:43",
      "value": 255.0
    }
  ]
}

这意味着有一个类具有一个名为 data 的属性(它可以映射到其他名称,但为了简单起见,让我们坚持使用这个名称),并且此属性是集合类型。它可以是支持 IEnumerable 接口的任何类型之一。

public class DataCollection
{
    public DataItem[] data { get; set; }
    //public List<DataItem> data { get; set; } // This would also work.
    //public HashSet<DataItem> data { get; set; } // This would work too.
}
public class DataItem
{
    public float value { get; set; }
    public DateTime time { get; set; } // This would work because the time is in an ISO format I believe so json.net can parse it into DateTime.
}

下一步是告诉 Json.Net 如何反序列化它。现在,当您知道它是一种复杂的数据类型时,您可以使用描述 json 结构的类型进行反序列化:

var dataCollection = JsonConvert.DeserializeObject<DataCollection>(jsonString);

如果你的 json 字符串中没有 data 属性,而是像这样的东西:

[
    {
      "time": "2014-12-12T13:52:43",
      "value": 255.0
    },
    {
      "time": "2016-12-12T13:52:43",
      "value": 25.0
    },
]

您可以直接将其反序列化为集合:

var dataItems = JsonConvert.DeserializeObject<List<DataItem>>(jsonString);

var dataItems = JsonConvert.DeserializeObject<DataItem[]>(jsonString);

更改日期条目绑定定义

public class ArrayData{
    public DataEntry data {set; get;}
}
public class DataEntry {
    public float Value { get; set; }
    public DateTime Time { get; set; }
}

在您的方法中,现在您可以收到一个 ArraData 对象

小心发送的日期时间字符串值以进行正确绑定