在C#中反序列化JSON集合

时间:2014-12-29 19:37:41

标签: c# json deserialization

这是我从服务器获取的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不可能反序列化吗?我真的很想使用现成的库,所以任何帮助都会受到赞赏。

3 个答案:

答案 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对象

请注意为正确绑定发送的日期时间字符串值