使用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());