我有一个从服务器返回的响应,我期待一个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);
答案 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
}