1
votes

Comment valider et supprimer les nœuds imbriqués d'un objet JSON

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?


5 commentaires

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


3 Réponses :


1
votes

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);


8 commentaires

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



2
votes

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);


0 commentaires

1
votes

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);


0 commentaires