簡體   English   中英

如何驗證和刪除JSON對象的嵌套節點

[英]How to validate and remove nested nodes of JSON Object

我有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”數組下面的節點。 在這里,我試圖刪除“time”屬性中沒有值“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對象中刪除上面的節點?

而不是item.Parent.Remove() ,只需嘗試item.Remove()

var json = "{  \r\n   \"movieList\":[  \r\n      {  \r\n         \"movieID\":1,\r\n         \"title\":\"TITLE 1\",\r\n         \"showTimes\":[  \r\n            {  \r\n               \"date\":\"xx\",\r\n               \"time\":[\"11:00\" , \"15:00\" ]\r\n            },\r\n            {  \r\n              \"date\":\"xx\",\r\n               \"time\":[\"11:00\"]\r\n            },\r\n            {  \r\n               \"date\":\"xx\",\r\n               \"time\":[\"18:00\" ]\r\n            },\r\n            {  \r\n              \"date\":\"xx\",\r\n               \"time\":[\"11:00\" , \"15:00\" , \"18:00\" ]\r\n            }\r\n         ]\r\n      }\r\n   ]\r\n}";

var 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.Remove();
    }
}

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

輸出:

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

我還建議使用模型類,但對於你的情況,這應該工作

 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"
          ]
        }
      ]
    }
  ]
}

您可以使用Linq查詢不及時包含“18:00”的節點並將其刪除。 例如,

var jToken = JToken.Parse(json);
var result = jToken["movieList"].SelectMany(x=>x["showTimes"])
                            .Select(x=>x["time"])
                            .Where(x=>!x.Any(c=>c.Value<string>()=="18:00"))
                            .ToList();
foreach(var item in result)
     item.Parent.Parent.Remove();
var output = jToken.ToString(Newtonsoft.Json.Formatting.Indented);

樣本輸出

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM