现有的基于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元素数组,如图所示。
答案 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();
答案 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