1
votes

Supprimer toutes les clés sauf une de JSONObject

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",
    ...
}


4 commentaires

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 que a ?


Êtes-vous prêt à utiliser gson? Essayez-vous simplement d'utiliser org.json.JSONObject?


@Jason, je peux utiliser org.json.JSONObject uniquement


3 Réponses :


3
votes

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


11 commentaires

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.



2
votes

Avez-vous envisagé de créer un nouvel objet avec la clé requise?

jsonObject = new JSONObject().put("a", jsonObject.get("a"));


0 commentaires

2
votes

Je pense qu'un moyen plus simple de le faire serait d'utiliser removeIf comme

jsonObject.keySet().removeIf(k -> !k.equals("a"));


0 commentaires