【问题标题】:JSON.getString doesn't return nullJSON.getString 不返回 null
【发布时间】:2012-10-29 08:31:09
【问题描述】:

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

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);

【问题讨论】:

  • 没关系,但这是一个丑陋的黑客,我不喜欢它
  • 为什么是丑陋的或黑客?你做得很好
  • 这很难看,因为我期望一个字符串值(可以是 null)但必须处理类型转换。
  • 在第一个示例中检查“null”是否会不那么难看?
  • @thepoosh - 你过早地优化了。 ==String.equals 之间的差异不大可能很大。

标签: java json org.json


【解决方案1】:

hack 看起来适合您的情况。

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

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

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

【讨论】:

  • +1 用于指出检查空值的正确方法。但是当你说没有太大区别时,我不同意。 isNUll 调用更简洁,应该优先于依赖 Object 和强制转换。
  • 您不能删除response.has("message)" 检查吗?只要该键不存在,isNull 就会返回 true,因此不会调用 getString,也不会抛出异常。
【解决方案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")

【讨论】:

    【解决方案3】:

    Kotlin 中更简单的方法

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

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 1970-01-01
      • 2021-12-13
      • 2016-12-28
      • 1970-01-01
      • 2012-05-11
      • 2016-01-30
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多