首页 > 解决方案 > 如何验证和删除 JSON 对象的嵌套节点

问题描述

我有以下 JSON 对象

{  
   "movieList":[  
      {  
         "movieID":1,
         "title":"TITLE 1",
         "showTimes":[  
            {  
               "date":"xx",
               "time":["11:00" , "15:00" ]
            },
            {  
              "date":"xx",
               "time":["11:00"]
            },
            {  
               "date":"xx",
               "time":["18:00" ]
            },
            {  
              "date":"xx",
               "time":["11:00" , "15:00" , "18:00" ]
            }
         ]
      }
   ]
}

想要删除“showTimes”数组下的以下节点。在这里,我试图删除“时间”属性中没有值“18:00”的节点。

{  
   "date":"xx",
   "time":["11:00" , "15:00" ]
},
{  
  "date":"xx",
   "time":["11:00"]
}

使用下面的代码,我可以在 foreach 循环中获取时间值

 StreamReader rs = new StreamReader("xx.json"); 

  string json = rs.ReadToEnd();

  JObject jsonObject = JObject.Parse(json);

  JToken jToken = JToken.Parse(json);

 var result = jToken["movieList"].SelectMany(x => x["showTimes"].SelectMany(y => y["time"].Select(z => z)).ToList());

      foreach (var item in result)
        {
          if (item.ToString() != "18:00")
              {
                // item.Parent.Remove();
              }
        }

如何在 foreach 循环中从我的 JSON 对象中删除上述节点?

标签: c#jsonasp.net-web-apijson.net

解决方案


我也会建议使用模型类,但对于你的情况,这应该可以

 JObject jsonObject = JObject.Parse(json);
 JToken jToken = JToken.Parse(json);

 var result = jToken["movieList"].SelectMany(x => x["showTimes"]).ToList();

 foreach (var item in result)
 {
   var times = item.SelectTokens("time").Values().ToList();    
   if (!times.Where(x => x.ToString().Trim() == "18:00").Any())
   {
       item.Remove();
   }
 }

 var output = jToken.ToString(Formatting.Indented);   
 Console.WriteLine(output);

输出

{
  "movieList": [
    {
      "movieID": 1,
      "title": "TITLE 1",
      "showTimes": [
        {
          "date": "xx",
          "time": [
            "18:00"
          ]
        },
        {
          "date": "xx",
          "time": [
            "11:00",
            "15:00",
            "18:00"
          ]
        }
      ]
    }
  ]
}

推荐阅读