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

时间:2016-03-29 16:19:44

标签: 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对象读取原始数据。

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

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

2 个答案:

答案 0 :(得分:2)

@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();

小提琴: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();

小提琴:https://dotnetfiddle.net/0QXUzZ

答案 1 :(得分:1)

很简单,您的根对象包含List<List<>>

您的对象应如下所示:

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

public class RootObject
{
    public List<List<InnerObject>> rows { get; set; }
}

然后使用JSON.NET:

string json = @"{'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'}
                ]]}";

var rootObject = JsonConvert.DeserializeObject<RootObject>(json);

顺便说一下,这个站点json2csharp可以从JSON生成C#类,让生活变得轻松:)

编辑:

您也可以使用dynamic,然后避免使用`RootObject:

中的解析器
var rootObject = JsonConvert.DeserializeObject<dynamic>(json);
rootObject.rows[0] <--- should have what you need