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

时间:2015-04-23 09:02:04

标签: c# linq json.net

使用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的新手,欢迎所有建议。

1 个答案:

答案 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());