【问题标题】:No Json deserializer found for type List Option没有找到类型列表选项的 Json 反序列化器
【发布时间】:2018-09-01 21:36:34
【问题描述】:

如何使用 play json OFormat 宏来获取选项列表?

val text = """[{"name": "John", "age": 30}, null, {"name": "Steve", "age": 34}]"""
import play.api.libs.json.Json
case class Person(name: String, age: Int)
implicit val personFormat = Json.format[Person]
val data = Json.parse(text).validate[List[Option[Person]]]

// Error: No Json deserializer found for type List[Option[Person]]. Try to implement an implicit Reads or Format for this type.

作为一种解决方法,我正在执行以下操作:

val data = Json.parse(text).as[Array[JsValue]].toList.map {
  case JsNull => None
  case x => Some(x.validate[Person].get)
}
println(data)

// List(Some(Person(John,30)), None, Some(Person(Steve,34)))

如果没有这种解决方法,我如何仅使用 OFormat 宏来实现相同的效果?

【问题讨论】:

  • 您需要添加import play.api.libs.json._
  • 这并不能解决问题;我仍然遇到同样的错误。

标签: json scala playframework-2.0


【解决方案1】:

不确定是否可以直接进行,但例如可以这样做(使用this 答案):

val text = """[{"name": "John", "age": 30}, null, {"name": "Steve", "age": 34}]"""

import play.api.libs.json._

implicit def optionFormat[T: Format]: Format[Option[T]] = new Format[Option[T]]{
  override def reads(json: JsValue): JsResult[Option[T]] = json.validateOpt[T]

  override def writes(o: Option[T]) = o match {
    case Some(t) ⇒ implicitly[Writes[T]].writes(t)
    case None ⇒ JsNull
  }
}

case class Person(name: String, age: Int)

implicit val personFormat= {
  implicit val f = Json.format[Person]
  implicitly[Format[Option[Person]]]
}


val data = Json.parse(text).validate[List[Option[Person]]] // JsSuccess(List(Some(Person(John,30)), None, Some(Person(Steve,34))),)
Json.toJson(data.get) // [{"name":"John","age":30},null,{"name":"Steve","age":34}]

它不能自己翻译Reads[Person] -> Reads[Option[Person]] -> Reads[List[Option[Person]]]。我确实通过辅助通用方法帮助获得Reads[Option[Person]]。可能,模拟方法在 play lib 中可用..

【讨论】:

  • 酷,谢谢!我从你的def optionFormat 中删除了implicit 关键字,然后声明了implicit val f = Json.format[Person]implicit val of = optionFormat[Person]。效果很好,谢谢!
  • “可能,模拟方法在 play lib 中可用..”。我会这么说,但我没有找到。如果你遇到过,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多