как получить реальное нулевое значение вместо значения JSONObject.NULL при синтаксическом анализе JSON в grails

#json #grails #groovy #null

#json #grails #groovy #null

Вопрос:

Я пытаюсь проанализировать некоторый JSON в Grails, используя grails.converters .Библиотека JSON. У меня есть поле, которое будет содержать либо строку, либо нулевое значение. Когда я анализирую JSON и получаю поле, нулевые значения возвращаются как тип JSONObject.NULL . Это нехорошо при проверке!= null, поскольку JSONObject.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 .

Я попробовал использовать это предложение здесь.toString(), но в итоге он вернул строковое значение ‘null’ вместо фактического null для значения JSONObject.NULL.

Комментарии:

1. для строки даты отсутствует закрывающая кавычка. может быть, это проблема?

2. это пример кода для иллюстрации, а не фактический запущенный код. это для иллюстрации. Я исправил цитату, но это не та проблема, которую я иллюстрирую

Ответ №1:

Вы можете найти это более полезным и естественным

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

Комментарии:

1. Я получаю NullPointerException , когда использую JSONObject.NULL.equals(...) . В отладчике я вижу это JSONObject.NULL = null ….

2.В зависимости от используемой библиотеки, пожалуйста, смотрите docs.oracle.com/javaee/7/api/javax/json/JsonValue.html#NULL developer.android.com/reference/org/json/JSONObject.html#NULL

Ответ №2:

Посмотрите на: http://grails.1312388.n4.nabble.com/The-groovy-truth-of-JSONObject-Null-td3661040.html

Ян Робертс упоминает хороший трюк, позволяющий сделать возможной проверку null:

 JSONObject.NULL.metaClass.asBoolean = {-> false} 
  

Комментарии:

1. Обратите внимание, что это все еще не позволяет вам использовать оператор безопасной навигации ?. , как это было бы естественно для «реальной» карты.

Ответ №3:

Я думаю, что нашел лучшее решение, которое заключается в переопределении реализации toString() метода JSONObject.NULL внутреннего класса путем копирования JSONObject.java файла в ваш src/java проект Grails, а затем изменения реализации на это:

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

После перезапуска с этим новым классом в вашем classpath загрузчик классов будет использовать ваш JSONObject класс вместо того, который упакован в зависимости Grails.

Убедитесь, что вы храните его в том же пакете, что и оригинал.

Для получения более подробной информации вы можете перейти сюда: https://github.com/grails/grails-core/issues/9129

Надеюсь, это поможет 🙂