J'ai ci-dessous l'objet JSON
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(); } }
Je voulais supprimer les nœuds ci-dessous sous le tableau "showTimes". Ici, j'essaie de supprimer les nœuds qui n'ont pas la valeur "18:00" dans la propriété "time".
{ "date":"xx", "time":["11:00" , "15:00" ] }, { "date":"xx", "time":["11:00"] }
en utilisant le code ci-dessous, je peux obtenir des valeurs de temps dans boucle foreach
{ "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" ] } ] } ] }
Comment supprimer les nœuds ci-dessus de mon objet JSON dans la boucle foreach?
3 Réponses :
Au lieu de item.Parent.Remove ()
, essayez simplement item.Remove()
:
{ "movieList": [ { "movieID": 1, "title": "TITLE 1", "showTimes": [ { "date": "xx", "time": [] }, { "date": "xx", "time": [] }, { "date": "xx", "time": [ "18:00" ] }, { "date": "xx", "time": [ "18:00" ] } ] } ] }
Résultat: p>
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);
Avez-vous testé cela? Cela ne ressemble pas à l'exigence d'OP
@ ssilas777 oui je l'ai testé. Qu'est-ce que cela ne ressemble pas à l'exigence du PO?
Vérifiez la sortie qu'il voulait et la sortie que vous obtenez
{"date": "xx", "time": ["18:00"]}, {"date": "xx", "time": ["11:00", "15:00", "18 : 00 "]} .. Cela devrait être sa sortie
@ ssilas777 Je l'ai lu comme OP voulant supprimer les nœuds qui ne sont pas égaux à "18:00", ce que son exemple de code essaie de faire
@ ssilas777 assez bien. Peut-être que dans la question, l'OP aurait dû mettre le JSON de sortie attendu pour éviter toute confusion.
@ ssilas777 voulait supprimer le nœud entier au lieu de rendre le tableau vide. donc essayer en tant que Parent.remove () {"date": "xx", "time": ["11:00", "15:00"]}, {"date": "xx", "time": [ "11:00"]}
@ user2038538 vérifier ma réponse
Je suggérerai également d'utiliser la classe de modèle, mais pour votre cas, cela devrait fonctionner
{ "movieList": [ { "movieID": 1, "title": "TITLE 1", "showTimes": [ { "date": "xx", "time": [ "18:00" ] }, { "date": "xx", "time": [ "11:00", "15:00", "18:00" ] } ] } ] }
output
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);
Vous pouvez utiliser Linq pour rechercher des nœuds qui ne contiennent pas "18:00" dans le temps et les supprimer. Par exemple,
{ "movieList": [ { "movieID": 1, "title": "TITLE 1", "showTimes": [ { "date": "xx", "time": [ "18:00" ] }, { "date": "xx", "time": [ "11:00", "15:00", "18:00" ] } ] } ] }
Exemple de sortie
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);
Je suggérerais de commencer par app.quicktype.io?share=8CYNaPjpEs2AKwfL0F2x .
Je ne peux pas utiliser la classe de modèle ici, je veux retourner JSON dynamique à l'interface utilisateur. time ("18:00") est le paramètre d'entrée pour modifier mon objet JSON
Pourquoi ne pouvez-vous pas générer le JSON dont vous avez besoin à partir de classes concrètes? Je sais que j'ai l'impression de ne pas aider - mais 95% des questions JSON disparaîtraient si les gens utilisaient des cours concrets comme point de départ.
S'il vous plaît voir ce lien possible vous sera utile. Cependant, je vous recommande vivement @mjwills comment
Double possible de Suppression d'un élément d'une réponse JSON