J'ai un JSONObject (org.json) comme celui-ci:
{"a": "a"}
Je voudrais supprimer toutes les clés sauf a
. Existe-t-il une manière élégante de faire cela autre que mon approche naïve?
Iterator<String> keys = jsonObject.keys(); while (keys.hasNext()) { if (!keys.next().equals("a")) { keys.remove(); } }
Résultat attendu:
{ "a": "a", "b": "a", "c": "a", "d": "a", "e": "a", "f": "a", "g": "a", ... }
3 Réponses :
Sans utiliser Gson, c'est une façon de réduire le nombre de lignes, mais je ne suis pas un grand fan de l'utilisation d'ArrayList pour créer une copie des clés afin d'éviter une ConcurrentModificationException. Honnêtement, ce que vous avez n'est pas mauvais.
List<String> keysForRemoval = object.keySet() .stream() .filter(key -> !key.equals("a")) .collect(Collectors.toList()); keysForRemoval.forEach(object::remove);
Je déclarerais même la liste et lui ferais 2 lignes à cause de cet horrible nouvel appel à ArrayList.
new ArrayList<>(object.keySet()) .stream() .filter(key -> !key.equals("a")) .forEach(object::remove);
Honnêtement, vous ne pouvez rien faire d'autre. L'option originale est également assez valable.
Ouais, c'est un peu dommage. Ouais je suis complètement d'accord. Cas d'utilisation parfait pour Iterator.
Non, il modifie l'objet JSON sous-jacent en supprimant toutes les clés et les valeurs effectives si elles ne correspondent pas à la clé que vous souhaitez conserver, qui est un
.
@HarshalParekh, votre solution originale fonctionne parfaitement bien, il suffit de la tester localement.
J'ai compris. Mais, il aura besoin d'espace supplémentaire pour que tout le JSONObject
soit stocké dans ArrayList
.
@ rxn1d. oui, c'est mentionné dans la question.
Vous avez demandé de l'élégance, pas de l'efficacité.
@Jason, assez juste
J'espère néanmoins que cela aide.
@Jason, la solution peut-elle également être modifiée pour JSONArrays? La question est ici: stackoverflow.com/questions/61037130/...
@ rxn1d Vous pouvez effectuer quelque chose de plus simple.
Avez-vous envisagé de créer un nouvel objet avec la clé requise?
jsonObject = new JSONObject().put("a", jsonObject.get("a"));
Je pense qu'un moyen plus simple de le faire serait d'utiliser removeIf
comme
jsonObject.keySet().removeIf(k -> !k.equals("a"));
Introduisez une liste avant de l'itérer et ajoutez-y des éléments où
key! = "A"
. Et puis parcourez cette liste et supprimez les clés à l'aide de jsonObject.remove (clé)Je n'ai besoin que de
a
, pourquoi est-ce que je stockerais tout autre chose quea
?Êtes-vous prêt à utiliser gson? Essayez-vous simplement d'utiliser org.json.JSONObject?
@Jason, je peux utiliser
org.json.JSONObject
uniquement