在 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 无法反序列化吗?我真的很想使用现成的库,所以任何帮助将不胜感激。
这是行不通的,因为您的 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 对象
小心发送的日期时间字符串值以进行正确绑定