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

Я пытаюсь проанализировать некоторые 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.

3 ответа

Решение

Взгляните на: http://grails.1312388.n4.nabble.com/The-groovy-truth-of-JSONObject-Null-td3661040.html

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

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

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

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

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

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

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

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

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

Надеюсь, поможет:-)

Другие вопросы по тегам