使用C#和Linq查询JSON时,是否有更好的方法来检索以下JSON /代码的子对象?
对象模型有一个'数据'具有整数id,字符串值和' Item'的类属性。
'项目' class具有整数id和字符串值属性。
while (true) {
int mark = readMark(scanner, count);
if (mark == -1) {
break;
}
count++;
total += mark;
}
// Now print out the average, etc
...
private static int readMark(Scanner scanner, int count) {
System.out.println("Please enter mark " + count);
while (true) {
int mark = scanner.nextInt();
if (mark >= -1 && mark <= 100) {
return mark;
}
System.out.println("Invalid mark, please re-enter");
}
}
对于上面我解析如下:
{
"data":[
{
"id" : 123,
"value" : "Something",
"childObject":{
"id" : 345,
"value" : "Something else",
},
},
{
"id" : 467,
"value" : "Nothing",
}
]
}
如果孩子对象是一个&#39;项目&#39;我可以用这样的东西替换最后一个Data构造函数参数:
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();
}
哪个对我来说更好,但可能不会更好?
LINQ和JSON.NET的新手,欢迎所有建议。
答案 0 :(得分:0)
如果你知道确切的结构,你可以构建一个具有相同结构的类/类集。所以你会有
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.Count只返回
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());