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

C# 使用JSON.net将内部数组反序列化为对象,c#,.net,json.net,C#,.net,Json.net,现有的基于JSON的web服务返回一个相当混乱的JSON对象,其中所有有用的数据都包含在一个数组的元素中,该数组本身就是一个1元素数组的内容。类似这样的内容(我正在匿名,希望没有拼写错误): 使用JSON.net,我需要访问这些行子元素中的每一个,但我不确定如何迭代,也不确定我应该反序列化为具体类型还是从JSON对象读取原始数据 数据将在方法内部聚合,因此每个行的“类型”不需要在方法外部知道 行始终是一个包含元素数组的单元素数组,如图所示。很简单,您的根对象包含一个列表: 您的对象应该如下所示:

现有的基于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();