[英]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.