JSON.getString不返回null

时间:2012-10-29 08:31:10

标签: java json org.json

我有一个从服务器返回的响应,我期待一个String值,所以我写这个来解析它

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

然后,当我在我的代码中使用它并从服务器获取null值时,该函数不会返回null,而是返回"null"

我见过this bug report,但我没有看到解决方案。

修改

我有一个很小的黑客来解决这个问题,但它很难看,我正在寻找更好的解决方案:

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

编辑#2:

多年以后,回到这个问题,我发现我在这里并没有完全错误,JSONObject有一个内置的方法。

JSONObject获取可选值的方法是使用this method JSONObject.optString("message", DEF_VALUE);

3 个答案:

答案 0 :(得分:20)

黑客看起来对你的情况没问题。

另一种选择是使用方法boolean isNull(String key),然后根据返回的布尔值继续您的选项。类似的东西:

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

但是,我认为您当前的实施与此之间没有太大区别。

答案 1 :(得分:1)

使用Kotlin类扩展时,这很容易解决:

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

然后例如name在以下位置为空:

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

答案 2 :(得分:0)

Kotlin 中更简单的方法

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