Я пишу функцию, чтобы получить запись от JSONObject
. Так как это JSON, запись по имени ввода может быть или не существовать, и поэтому функция возвращает Option
, которая будет None
, когда Try
терпит неудачу, или если значение равно NULL
при успешном завершении. Функция не может скомпилировать и ошибки относительно неправильного типа возврата.Scala Тип опции не определяется как ожидалось
def tryGet[T](jsonObject: JSONObject, name: String): Option[T] = {
Try(jsonObject.get(name))
.map(x => if(JSONObject.NULL.equals(x)) None else x.asInstanceOf[T])
.toOption
}
Ошибка:
Expression of type Option[Any] doesn't conform to expected type Option[T]
Может кто-нибудь сказать мне, что я делаю неправильно здесь? Кроме того, это идиоматический подход к решению проблемы?
Update:
Изменение к ниже работ
def tryGet[T](jsonObject: JSONObject, name: String): Option[T] = {
Try(jsonObject.get(name))
.filter(!JSONObject.NULL.equals(_))
.map(_.asInstanceOf[T])
.toOption
}
Да, я попробовал и он бросает «Exception в потоке„основной“java.lang.ClassCastException: org.json.JSONObject $ Null не может быть приведен к java.lang.String» во время выполнения, как он пытается отбросить значение null до строки. – broun
@broun Вы должны написать, какую библиотеку json вы используете. Я думаю, что ваша библиотека json не возвращает 'null', вместо этого возвращает ненулевой объект' org.json.JSONObject $ Null' – ymonad
Да, просто понял, что он возвращает пользовательский тип NULL. Я проверял java null вместо – broun