c# - 使用 JSON.net 将内部数组反序列化为对象

标签 c# .net json.net

现有的基于 JSON 的 Web 服务返回一个相当困惑的 JSON 对象,其中所有有用的数据都包含在数组的元素中,该数组本身就是 1 元素数组的内容。像这样的东西(我匿名了,希望没有错别字):

{"rows":[[
    {"name":"John","time":"2016-03-20 01:00:00","id":"2","code":"1234"},
    {"name":"Sam","time":"2016-03-20 01:00:00","id":"24","code":"999"},
    {"name":"Paul","time":"2016-03-20 01:00:00","id":"12","code":"6512"}
]]}

使用 JSON.net,我需要访问每个行子元素,但我不确定如何迭代它,以及是否应该反序列化为具体类型,或者只是从 json 对象读取原始数据。

数据将在方法内部聚合,因此每个的“类型”不需要在方法外部知道。

rows始终是一个包含如图所示的元素数组的 1 元素数组。

最佳答案

@Fals 的解决方案应该可以很好地工作,但是如果您想取消 RootObject,您可以使用 Json.Net 的 LINQ-to-JSON API解析 JSON 并将数据放入易于使用的简单项目列表中。

假设您为项目数据定义了一个类,如下所示:

public class Item
{
    public string name { get; set; }
    public DateTime time { get; set; }
    public string id { get; set; }
    public string code { get; set; }
}

然后您可以执行以下操作来获取项目列表:

List<Item> items = JObject.Parse(json)["rows"][0]
                          .Select(jt => jt.ToObject<Item>())
                          .ToList();

fiddle :https://dotnetfiddle.net/FtB3Cu


如果您想完全避免声明任何类并使用匿名类型,则可以将代码更改为:

var items = JObject.Parse(json)["rows"][0]
                   .Select(jt => new 
                   {
                       name = (string)jt["name"],
                       time = (DateTime)jt["time"],
                       id = (string)jt["id"],
                       code = (string)jt["code"]
                   })
                   .ToList();

fiddle :https://dotnetfiddle.net/0QXUzZ

关于c# - 使用 JSON.net 将内部数组反序列化为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36289762/

相关文章:

c# - Newtonsoft 两次反序列化同一个 json 流的有效方法

c# - 是否可以为 Windows 8 Surface RT 创建本地 Web 服务器

C# JsonConvert SerializeXmlNode 空属性

c# - 以编程方式设置数据库连接优先级

c# - 私有(private)构造函数获取空私有(private)静态只读字符串

.net - 如何让 SignalR 订阅 Redis channel ?

c# - 点网核心: can't run unit tests

c# - 为什么会有 JConstructor?

c# - Visual Studio 2008 烦人的 block 注释自动处理

c# - 如何在运行时创建 WPF UserControl 的图像