3 votes

Conversion d'un tableau imbriqué en JSON

J'ai un tableau imbriqué en Java, quelque chose comme ça :

String [] [] x;

Dans mon code, je le convertis en une chaîne JSON pour le transmettre à travers le pont @JavascriptInterface au javascript qui s'exécute dans une WebView à l'aide de ce code :

String ret = (new JSONArray(Arrays.asList(x))).toString();

Cela fonctionne bien sur les appareils récents, mais en testant un appareil plus ancien, je rencontre un comportement très étrange. Au lieu de créer une belle chaîne comme celle-ci :

"[ [ 1.234, 5, 7 ], [ 23.456, 7, 8 ] ]"

il crée une chaîne qui ressemble à ceci :

'["[Ljava.lang.String;@405ba988"]'

Pour autant que je sache, tous les objets que j'utilise (JSONArray, Arrays) et les fonctions membres correspondantes (toString, asList) existent depuis le niveau 1 de l'API.

Est-ce que je fais quelque chose de mal, ou est-ce qu'il y a quelque chose que je n'ai pas fait et que je dois faire pour m'adapter aux versions antérieures d'Android ?

3voto

Oleg Points 310

Avant Android 4.4 (api 19), la fonction suivants était le code du constructeur :

public JSONArray(Collection copyFrom) {
    this();
    Collection<?> copyFromTyped = (Collection<?>) copyFrom;
    values.addAll(copyFromTyped);
}

Comme vous pouvez le voir, il ne fait qu'ajouter les membres de la collection, c'est pourquoi vous obtenez '["[Ljava.lang.String;@405ba988"]' aucun traitement supplémentaire n'est effectué.

Dans Android 4.4 (api 19), certaines fonctionnalités ont été ajoutées et modifiées. envelopper a été ajoutée à la méthode JSONObject qui peut gérer un tableau et le même constructeur de JSONArray était modifié pour l'utiliser :

public JSONArray(Collection copyFrom) {
    this();
    if (copyFrom != null) {
        for (Iterator it = copyFrom.iterator(); it.hasNext();) {
            put(JSONObject.wrap(it.next()));
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X