24

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

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ための方法が組み込まれていることがわかりました。

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

4

3 に答える 3

25

ハックはあなたの状況では問題ないようです。

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

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

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

于 2012-10-29T08:40:01.627 に答える
2

これは、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")
于 2020-03-01T00:40:34.490 に答える
0

Kotlin でのより簡単な方法

fun JSONObject.getNullableString(name: String) : String? {
    if (has(name) && !isNull(name)) {
        return getString(name)
    }
    return null
}
于 2021-01-28T09:14:01.870 に答える