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

hack 看起来适合您的情况。

另一种选择是使用该方法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
    }
}

然后 egname将在以下位置为空:

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 回答