JsValue отфильтровывает нулевые значения - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь выяснить, как избежать null значений.Моя проблема в том, что я запрашиваю API, и он возвращает значение null.

Вот пример:

import play.api.libs.json._

case class InnerExample(value: String)

object InnerExample {
def fromJson(json: JsValue) = InnerExample(
    value = (json \ "value")as[String]
}

case class Example(innerValue: Option[InnerExample])

object Example {
def fromJson(json: JsValue) = Example(
    optionalValue = (json \ "innerValue").asOpt[String].map(InnerExample.apply)
    )
}

У меня проблема в том, что asOpt преобразуется innerValue не None, а Some(null).Я понимаю почему, и это имеет большой смысл.Но мне нужно найти способ справиться с этим.Нечто более элегантное, чем сопоставление для Some(null).Я очень благодарен за любые идеи.

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Благодаря ответу @Mario Galic я вернулся к своему коду и открыл документацию JSLookups, которую я получаю, когда использую метод \ из JsValue.Оказывается, у него есть способ справиться с null -значениями.Это делается так:

optionalValue = (json \ "innerValue").validateOpt[String].get.map(InnerExample.apply)

Я думаю, что путь Марио чище и его следует рекомендовать, но в моем случае это будет означать переписать 10 классов, и мой способ быстрее изменить мой существующий код.Тем не менее, именно поэтому я буду отмечать ответ Марио как принятый ответ.

0 голосов
/ 08 июня 2018

Рассмотрим readNullable.Вот рабочий пример:

import play.api.libs.json._

case class InnerExample(value: String)
case class Example(innerValue: Option[InnerExample])

object InnerExample {
  implicit val format = Json.format[InnerExample]
}

object Example {
  implicit val jsonread: Reads[Example] =
    (JsPath \ "innerValue").readNullable[InnerExample].map(Example.apply)
}

object NullableJson extends App {
  val jsonSomeStr = """{ "innerValue": { "value": "woohoo" } }"""
  val jsonSome = Json.parse(jsonSomeStr).as[Example] 
  println(jsonSome) // Example(Some(InnerExample(woohoo)))

  val jsonNullStr = """{ "innerValue": null }"""
  val jsonNull = Json.parse(jsonNullStr).as[Example]
  println(jsonNull) // Example(None)
}
...