25 votes

JSON.getString ne retourne pas null

J'ai une réponse qui revient d'un serveur et j'attends une valeur de type String, j'ai donc écrit ceci pour l'interpréter

public String getMessageFromServer(JSONObject response) {
    String msg = response.getString("message");
    return msg;
}

alors, quand j'utilise ceci dans mon code et que j'obtiens une null depuis le serveur, la fonction ne renvoie pas la valeur null il renvoie "null" à la place.

J'ai vu ce rapport de bogue mais je ne vois pas de solution.

EDIT :

J'ai un petit hack pour résoudre ce problème mais c'est moche et je cherche une meilleure solution :

public String getMessageFromServer(JSONObject response) {
    Object msg = response.get("message");
    if(msg == null) {
         return null;
    }
    return (String) msg;
}    

EDIT #2 :

après des années, en revenant sur cette question, je vois que je n'avais pas tout à fait tort ici et que JSONObject a une méthode intégrée pour cela.

La façon d'obtenir une valeur facultative à partir d'un JSONObject est d'utiliser cette méthode JSONObject.optString("message", DEF_VALUE);

25voto

Sujay Points 5506

Le hack semble correct pour votre situation.

L'autre option serait d'utiliser la méthode boolean isNull(String key) et ensuite, en fonction de la valeur booléenne renvoyée, poursuivez votre option. Quelque chose comme ça :

public String getMessageFromServer(JSONObject response) {
    return ((response.has("message") && !response.isNull("message"))) ? response.getString("message") : null;
} 

Mais alors, je ne pense pas qu'il y ait une grande différence entre votre implémentation actuelle et celle-ci.

2voto

jhavatar Points 566

Ce problème est facile à résoudre lorsqu'on utilise des extensions de classe Kotlin :

fun JSONObject.optNullableString(name: String, fallback: String? = null) : String? {
    return if (this.has(name) && !this.isNull(name)) {
        this.getString(name)
    } else {
        fallback
    }
}

Alors, par exemple name sera nulle :

val name : String? = JSONObject("""{"id": "foo", "name":null}""").optNullableString("name")

0voto

V. Kalyuzhnyu Points 1515

Une méthode plus simple en Kotlin

fun JSONObject.getNullableString(name: String) : String? {
    if (has(name) && !isNull(name)) {
        return getString(name)
    }
    return null
}

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