C# 使用JSON.net将内部数组反序列化为对象
现有的基于JSON的web服务返回一个相当混乱的JSON对象,其中所有有用的数据都包含在一个数组的元素中,该数组本身就是一个1元素数组的内容。类似这样的内容(我正在匿名,希望没有拼写错误): 使用JSON.net,我需要访问这些行子元素中的每一个,但我不确定如何迭代,也不确定我应该反序列化为具体类型还是从JSON对象读取原始数据 数据将在方法内部聚合,因此每个C# 使用JSON.net将内部数组反序列化为对象,c#,.net,json.net,C#,.net,Json.net,现有的基于JSON的web服务返回一个相当混乱的JSON对象,其中所有有用的数据都包含在一个数组的元素中,该数组本身就是一个1元素数组的内容。类似这样的内容(我正在匿名,希望没有拼写错误): 使用JSON.net,我需要访问这些行子元素中的每一个,但我不确定如何迭代,也不确定我应该反序列化为具体类型还是从JSON对象读取原始数据 数据将在方法内部聚合,因此每个行的“类型”不需要在方法外部知道 行始终是一个包含元素数组的单元素数组,如图所示。很简单,您的根对象包含一个列表: 您的对象应该如下所示:
行的“类型”不需要在方法外部知道
行
始终是一个包含元素数组的单元素数组,如图所示。很简单,您的根对象包含一个列表
:
您的对象应该如下所示:
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; }
}
公共类InnerObject
{
公共字符串名称{get;set;}
公共日期时间{get;set;}
公共字符串id{get;set;}
公共字符串代码{get;set;}
}
公共类根对象
{
公共列表行{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);
stringjson=@“{'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(json);
顺便说一下,这个网站可以从JSON生成C#类,让生活变得轻松:)
编辑:
您还可以使用dynamic,然后避免使用`RootObject:
var rootObject = JsonConvert.DeserializeObject<dynamic>(json);
rootObject.rows[0] <--- should have what you need
var rootObject=JsonConvert.DeserializeObject(json);
rootObject.rows[0]@Fals的解决方案应该可以很好地工作,但是如果您想去掉rootObject
,您可以使用Json.Net解析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();
小提琴:谢谢。有没有一种简洁的方法可以避免需要RootObject
,而无需手动破解字符串?e、 .g只需从JSON.net调用中获取InnerObject
的数组/列表?@Mr.Boy您可以创建一个自定义JsonCreationConverter,@Mr.Boy请参见上面的编辑,使思考更具动态性:)谢谢Brian。是否有任何方法可以进一步将此方法与本地匿名类型结合起来,以避免声明具体类型?或者只是有一个私有的内部类?@Mr.Boy是的,您可以使用匿名类型。我已经编辑了我的答案,以展示如何。如果你选择这条路线,它也应该和一个内部类一起工作。很高兴我能帮上忙。
List<Item> items = JObject.Parse(json)["rows"][0]
.Select(jt => jt.ToObject<Item>())
.ToList();
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();