在grails中解析JSON时如何获取真正的空值而不是JSONObject.NULL值

Posted

技术标签:

【中文标题】在grails中解析JSON时如何获取真正的空值而不是JSONObject.NULL值【英文标题】:how to get a real null value instead of a JSONObject.NULL value when parsing JSON in grails 【发布时间】:2011-12-13 05:33:11 【问题描述】:

我正在尝试使用 grails.converters.JSON 库在 Grails 中解析一些 JSON。我有一个包含字符串或空值的字段。当我解析 JSON 并获取该字段时,空值作为 JSONObject.NULL 类型返回。这在检查 != null 时不好,因为 JSONObject.NULL 被评估为非 null(不适合 null 检查)

def obj = JSON.parse('"date1":null,"date2":"2011-06-26T05:00:00Z"')
def date1 = obj.date1
if (date1)
     parse(date1)   // parse error occurs here because date1 evaluates true in the if because it is JSONObject.NULL

有没有一种简单的方法可以让解析器解析一个真正的空值,这样我就不必检查对象是否是 JSONObject.NULL。

我尝试了建议 here 使用 .toString(),但它最终返回字符串值“null”而不是 JSONObject.NULL 值的实际 null。

【问题讨论】:

日期字符串缺少右引号。这可能是问题吗? 这是用于说明的示例代码,不是实际运行代码。这是为了说明。我已经更正了引用,但这不是我要说明的问题 【参考方案1】:

您可能会发现这更有用和自然

    JSONObject.NULL.equals(jsonObj.get("key_name"))

【讨论】:

当我使用JSONObject.NULL.equals(...) 时,我得到了NullPointerException。在调试器中我看到JSONObject.NULL = null.... 取决于您使用的库,请参阅docs.oracle.com/javaee/7/api/javax/json/JsonValue.html#NULLdeveloper.android.com/reference/org/json/JSONObject.html#NULL【参考方案2】:

看看:http://grails.1312388.n4.nabble.com/The-groovy-truth-of-JSONObject-Null-td3661040.html

Ian Roberts 提到了一个使空检查成为可能的好技巧:

JSONObject.NULL.metaClass.asBoolean = -> false 

【讨论】:

请注意,这仍然不允许您使用安全导航运算符?.,就像使用“真实”地图一样自然。【参考方案3】:

我想我找到了一个更好的解决方案,它包括通过将 JSONObject.java 文件复制到您的 Grails src/java 项目中,然后将实现更改为以下方式来覆盖 JSONObject.NULL 内部类的 toString() 方法实现:

    /**
     * Get the "" string value.
     * @return An empty String "".
     */
    @Override
    public String toString() 
        return "";
    

一旦您在类路径中使用这个新类重新启动,类加载器将使用您的 JSONObject 类,而不是 Grails 依赖项中打包的类。

确保将其保存在与原件相同的包装中。

更多详情可以去这里:https://github.com/grails/grails-core/issues/9129

希望对你有帮助:-)

【讨论】:

以上是关于在grails中解析JSON时如何获取真正的空值而不是JSONObject.NULL值的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS、PHP 和 JSON 中使用来自 SQL Server 的空值

如何在流分析中检查 JSON 属性中的空值?

尝试获取数据时GraphQL中的空值[重复]

如何将 must_not 与 ElasticSearch + Grails 的空 JSON 属性一起使用?

使用 swiftyJSON 在 Swift 2.0 中解析 JSON 时获取空值

为 iphone 解析 json 时获取空值?