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