web-dev-qa-db-ja.com

JSON.getStringはnullを返しません

サーバーから応答が返ってきて、文字列値を期待しているので、これを解析用に作成しました

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

次に、これをコードで使用してサーバーからnull値を取得すると、関数はnullを返さず、代わりに_"null"_を返します。

このバグレポート を見たことがありますが、解決策が見つかりません。

編集:

私はこれを解決するための小さなハックを持っていますが、それは醜いです、そして私はより良い解決策を探しています:

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

編集#2:

数年後、この質問に戻ると、私はここで完全に間違っていたわけではなく、JSONObjectにはこのためのメソッドが組み込まれていることがわかります。

JSONObjectからオプションの値を取得する方法は、 このメソッドJSONObject.optString("message", DEF_VALUE);を使用することです。

20
thepoosh

ハックはあなたの状況に問題がないように見えます。

もう1つのオプションは、メソッドboolean isNull(String key)を使用し、返されたブール値に基づいてオプションを続行することです。何かのようなもの:

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

しかし、それでは、現在の実装とこれとの間に大きな違いはないと思います。

21
Sujay

Kotlinクラス拡張を使用すると、これは簡単に解決できます。

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

次に、例えばnameは次の場合はnullになります:

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