如何使用scala组合器在case类中读取可选的json值

时间:2015-01-30 21:49:12

标签: json scala combinators

我正在尝试处理JSON,它可以选择包含' info'它包含。在以下case类和combinator中捕获哪个以读取对象中的JSON。但代码无法编译。有没有更好的方法处理这个?信息可以是空的。

case class Info(sometimestamp: Option[Long])

object Info {
  implicit val InfoReads: Reads[Info] = (
    (JsPath \ "sometimestamp").readNullable[Long]
  )(Info.apply _)
}

{
  ...
  "info" : {
    "sometimestamp" : 1414535323436
  }
}

编译错误:

found   : play.api.libs.json.Reads[Option[Long]]
[error]  required: play.api.libs.json.Reads[models.Payload.Info]
[error]   ) (Info.apply _)

scala版本:2.11.2

感谢,

1 个答案:

答案 0 :(得分:2)

我不认为当你没有真正组合任何东西时,组合器的功能语法是可行的。但是这样做:

implicit val InfoReads: Reads[Info] = 
    (JsPath \ "sometimestamp").readNullable[Long].map(Info(_))

您可能还会考虑将JSON初始宏用于这样一个简单的案例类:

implicit val InfoReads: Reads[Info] = Json.reads[Info]