JSON.getString 不返回 null

2022-09-01 21:04:21

我有一个来自服务器的响应,我期望一个字符串值,所以我写了这个来解析它

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

然后,当我在代码中使用它并从服务器获取值时,该函数不会返回,而是返回。nullnull"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);


答案 1

黑客看起来很好,适合你的情况。

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

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

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


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

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