根据属性值从JObject返回子对象

时间:2019-04-10 10:25:15

标签: c# json linq json.net

我有一些JSON,如下所示。我想从中获取“类型”为“项目”的所有对象。

 string json = @"
        {
            'name': 'Object 1',
            'content': {
                'body': {
                    'id': 'body',
                    'type': 'Body'
                },
                'style': {
                    'id': 'style',
                    'type': 'Style'
                },
                'DynamicName-123': {
                    'id': 'DynamicName-123',
                    'type': 'Row'
                },
                'DynamicName-434': {
                    'id': 'DynamicName-434',
                    'type': 'Column'
                },
                'DynamicName-223': {
                    'id': 'DynamicName-223',
                    'type': 'Item'
                }
            }
        }";

JObject obj = JObject.Parse(json);

预期输出:

'id': 'DynamicName-223',
'type': 'Item'

我该怎么做?

2 个答案:

答案 0 :(得分:0)

您可以使用字典内部反序列化为匿名类型:

var template = new {name = "", content = new Dictionary<string, JObject>()};
var result = JsonConvert.DeserializeAnonymousType(json, template);

现在您可以从嵌套项目中获取所有信息:

foreach (var item in result.content)
    Console.WriteLine($"{item.Key}: id = {item.Value["id"]}, type = {item.Value["type"]}");

输出将是:

  

body:id = body,类型= Body
  样式:id =样式,类型=样式
  DynamicName-123:id = DynamicName-123,类型= Row
  DynamicName-434:ID = DynamicName-434,类型=列
  DynamicName-223:id = DynamicName-223,类型= Item

答案 1 :(得分:0)

您可以使用LINQ-to-JSON这样的查询来获得具有“项”的“类型”属性值的对象:

JObject obj = JObject.Parse(json);

List<JObject> items = obj["content"]
    .Children<JProperty>()
    .Where(p => (string)p.Value["type"] == "Item")
    .Select(p => (JObject)p.Value)
    .ToList();

提琴:https://dotnetfiddle.net/dy1nQC