使用C#和Linq解析JSON时,对嵌套的子对象进行反序列化



使用C#和Linq查询JSON时,是否有更好的方法来检索以下JSON/代码的子对象?

对象模型有一个"Data"类,该类具有整数id、字符串值和"Item"属性。

"Item"类具有整数id和字符串值属性。

{
"data":[
{            
"id" : 123,
"value" : "Something",
"childObject":{
"id" : 345,
"value" : "Something else",
},
},
{
"id" : 467,
"value" : "Nothing",
}
]
}

对于以上内容,我是这样解析的:

JObject jsonObj = JObject.Parse(jsonText);
JArray jsonArr = jsonObj.SelectToken("data") as JArray;
if (jsonArr.Count == 0)
{
return new List<Data>();
}
else
{
return jsonArr.Select(o => new Data((int)o["id"], (string)o["value"], o["childObject"] == null ? null : new Item((int)o["childObject"]["id"], (string)o["childObject"]["value"]))).ToList();
}

如果子对象是一个"Items"数组,我可以用以下内容替换最后一个Data构造函数参数:

o["childObject"].Count() == 0 ? 
new List<Item>() : 
o["childObject"].Select(i => new Item((int)i["id"], (string)i["value"]))).ToList()));

哪一个对我来说读起来更好,尽管可能不会更好?

LINQ和JSON.NET的新手,欢迎所有建议。

如果你知道确切的结构,你可以用相同的结构构建一个类/一组类。所以你会有

public class RootObject{
public List<DataObject> data{ get; set;}
}
public class DataObject {
public int id { get; set;}
public string value { get; set; }
public List<DataObject> childObject{ get; set;}
}

然后,您可以将其反序列化为自己的数据类型,然后将其转换为您可能需要的任何其他类型。

var deserializedData = JsonConvert.DeserializeObject<RootObject>(jsonText);
var jsonArr = deserializedData.data;
if (jsonArr.Count == 0)
{
return new List<Data>();
}
else
{
return jsonArr.Select(o => new Data(o.id, o.value, o.childObject.Select(c=>new Item {id= c.id, value = c.value }).ToList());
}

你甚至不需要检查jsonArr。计数只需返回

var deserializedData = JsonConvert.DeserializeObject<RootObject>(jsonText);
var jsonArr = deserializedData.data;
return jsonArr.Select(o => new Data(o.id, o.value, o.childObject.Select(c=>new Item {id= c.id, value = c.value }).ToList());

相关内容

  • 没有找到相关文章

最新更新