现有的基于 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/