J'ai un fichier JSON qui est un JSON ARRAY avec des objets JSON et je souhaite supprimer tout l'objet json si la valeur de longitude ou de latitude est une chaîne vide "".
J'utilise la bibliothèque org. json.simple. Voici mon fichier json:
JSONParser jsonParser = new JSONParser();
try (FileReader reader = new FileReader ("output.json")) {
Object obj = jsonParser.parse(reader);
JSONArray list = (JSONArray) obj;
list.forEach(node -> {
String vari = (String)((JSONObject)node).get("longitude").toString();
if (vari==null) {
((JSONObject) node).remove();
System.out.println("deleted");
}
}
...
et voici où je suis bloqué. :
[ { "Longitude": 9.96233,
"Latitude": 49.80404 },
{
"Longitude": 6.11499,
"Latitude": 50.76891
},
{ "Longitude": 6.80592,
"Latitude": 51.53548
},
{
"Longitude": 9.50523,
"Latitude": 51.31991 },
{
"Longitude": ""
"Latitude": ""
},
{
"Longitude": 9.93368,
"Latitude": ""
},
{
"Longitude": 11.56122,
"Latitude": 48.14496
},
{
"Longitude": 13.34253,
"Latitude": 52.5319
},
{
"Longitude": 6.11327,
"Latitude": 50.77715
},
{
"Longitude": ""
"Latitude": ""
}
]
Des suggestions comment puis-je modifier mon code?
3 Réponses :
utilisez .remove au lieu de .clear dans le code.
J'ai essayé d'utiliser remove () mais cela ne supprime que la clé, je ne peux pas supprimer l'objet entier.
Vous devez supprimer le nœud de la liste mais en raison d'un problème de modification simultanée (modification de la liste que vous bouclez) vous avez besoin d'une autre liste.
Je pense qu'il est plus facile de rassembler dans la nouvelle liste tous les nœuds qui se qualifient comme:
public void test2() throws Exception {
JSONParser jsonParser = new JSONParser();
JSONArray toBeRemoved = new JSONArray();
try (FileReader reader = new FileReader("output.json")) {
JSONArray list = (JSONArray) jsonParser.parse(reader);
((Collection<JSONObject>) list).forEach(node -> {
Object vari = node.get("Longitude");
// here any check that qualifies the node like also checking "Latitude"
if (vari != null && !vari.equals("")) {
return; // not to be removed
}
toBeRemoved.add(node);
});
list.removeAll(toBeRemoved);
} catch (Exception e) {
throw e;
}
}
Si vous souhaitez utiliser uniquement la liste d'origine, vous pouvez collecter des éléments à supprimer dans une autre liste et l'utiliser pour supprimer des nœuds de la liste d'origine:
@SuppressWarnings("unchecked")
@Test
public void test() throws Exception {
JSONParser jsonParser = new JSONParser();
JSONArray listNonNull = new JSONArray();
try (FileReader reader = new FileReader("output.json")) {
JSONArray list = (JSONArray) jsonParser.parse(reader);
((Collection<JSONObject>)list).forEach(node -> {
// here any check that qualifies the node like also checking "Latitude"
// Also no need to cast to a String
Object vari = node.get("Longitude");
if (vari != null && !vari.equals("")) {
listNonNull.add(node);
}
});
} catch (Exception e) {
throw e;
}
}
@ pirho Merci pour votre réponse, dois-je remplacer ma liste par celle-ci? car je fais aussi quelques modifications sur la liste précédente donc je dois utiliser la même liste avec ses nœuds. dois-je ajouter cette méthode à mon script et l'appeler dans le main?
parce que lorsque j'ai essayé de l'utiliser, j'ai eu de nombreuses erreurs dans mon code.
Je peux modifier ma réponse pour conserver la liste d'origine. Mais d'une manière ou d'une autre, je pense que vous devriez faire ce mod en premier et seulement hten le reste pour éviter les éléments en boucle que vous supprimez plus tard. Remplacez donc la liste par le nouveau si vous pouvez le faire en tant que tout premier mod. @Paupiette
@ pirho Merci d'avoir été utile
JSONParser jsonParser = new JSONParser();
try (FileReader reader = new FileReader("output.json")) {
Object obj = jsonParser.parse(reader);
JSONArray list = (JSONArray) obj;
ArrayList<JSONObject> objList = (ArrayList<JSONObject>) list.stream().filter(node -> {
String longitude = ((JSONObject) node).get("Longitude").toString();
String latitude = ((JSONObject) node).get("Latitude").toString();
if (longitude.isEmpty() || latitude.isEmpty()) {
return false;
}
return true;
}).collect(Collectors.toList());
} catch (IOException | ParseException e) {
e.printStackTrace();
}
Selon votre fichier JSON, la structure n'est pas un tableau d'objets. Tous les objets sont enveloppés dans un seul objet et cet objet est ajouté au tableau. Donc, en fait, il n'y a qu'un seul élément dans votre liste. Veuillez valider votre JSON à l'aide de l ' éditeur json .