这是我从服务器获取的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不可能反序列化吗?我真的很想使用现成的库,所以任何帮助都会受到赞赏。
答案 0 :(得分:5)
这不起作用,因为您的JSON指定了一个集合,并且您正尝试将其解析为一个对象。有很多json到c#类生成器你可以粘贴json来获得一个这样的生成器所在的适当的类定义here
更合适的定义是
public class Datum
{
public string time { get; set; }
public double value { get; set; }
}
public class RootObject
{
public List<Datum> data { get; set; }
}
然后deseralize as
var myObject = JsonConvert.DeserializeObject<RootObject> (jsonString);
答案 1 :(得分:1)
我想为你的问题添加一些额外的解释......
你写我正在尝试将JSON反序列化为一个非常简单的C#对象。 - 不幸的是,这不是完整的事实。你正在尝试的是反序列化一个非常简单的C#对象的集合。这个指标是json中的方括号:
{
"data": [
{
"time": "2014-12-12T13:52:43",
"value": 255.0
}
]
}
这意味着有一个属性名为 data
的类(它可以映射到其他名称,但为了简单起见,我们坚持使用此名称)并且这个property是一个集合类型。它可以是支持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);
答案 2 :(得分:0)
更改DateEntry绑定定义
public class ArrayData{
public DataEntry data {set; get;}
}
public class DataEntry {
public float Value { get; set; }
public DateTime Time { get; set; }
}
现在你的方法中你可以收到一个ArraData对象
请注意为正确绑定发送的日期时间字符串值