如何基于JObject的子属性值选择父属性值

时间:2019-03-28 12:59:13

标签: c# json json.net

我正在从API调用中获取json数据,并且需要从数据中读取特定值。

以下是json的简化版本:

  {
     "Modules":[
        {
           "ModuleId":370,
           "Title":"Getting Oriented",
           "Modules":[
              {
                 "ModuleId":378,
                 "Title":"Artifacts",
                 "Modules":[

                 ],
                 "Topics":[
                    {
                       "TopicId":379
                    },
                    {
                       "TopicId":380                     
                    },
                    {
                       "TopicId":381                     
                    }
                 ]
              }
           ],
           "Topics":[
              {
                 "TopicId":371               
              },
              {
                 "TopicId":372
              },
              {
                 "TopicId":373
              }
           ]
        },      
        {
           "ModuleId":389,
           "Title":"Build Your Solution",
           "Modules":[
              {
                 "ModuleId":390,
                 "Title":"Core Platform Configuration",
                 "Modules":[
                    {
                       "ModuleId":392,
                       "Title":"Artifacts",                  
                       "Topics":[
                          {
                             "TopicId":393                          
                          }
                       ]
                    }
                 ],
                 "Topics":[
                    {
                       "TopicId":391                   
                    }
                 ]
              }    

           ]
        }
     ]
  }

我将其转换为JObject并使用以下代码获取所有TopicId。

var topicIds = jo.Descendants()
    .OfType<JProperty>()
    .Where(p => p.Name == "TopicId" &&
                p.Value != null)
    .ToList();

从那里,我需要TopicId的父级的ModuleId值。

我尝试了以下操作,但它返回了父级的所有子级。

foreach (var topicId in topicIds)
{

   var moduleId = jo.DescendantsAndSelf()
        .OfType<JProperty>()
        .Where(p => p.Value == topicId.Value)
        .Select(p => p.Parent)
        .ToString();
}

我只希望来自“ TopicId”父对象的“ ModuleId”值

1 个答案:

答案 0 :(得分:1)

您已经拥有topicId属性,因此只需在循环内从那里向上导航即可获得相应的moduleId值:

var moduleId = (string)topicId.Parent.Parent.Parent.Parent["ModuleId"];

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