#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
Надеюсь, это поможет 🙂