使用Play Json和Salat格式化可空的Seq或对象列表

时间:2015-03-23 03:59:04

标签: json scala playframework-2.2 casbah salat

我想将json转换为Salat模型。我正在使用Play 2.X Scala Json。我找不到任何格式化可空的Seq的文档。根据{{​​3}},我不能使用Option [Seq]或Option [List]。

以下json很好,但有时候“位置”可能会丢失。

{
    "id": 581407,
    "locations": [
        {
            "id": 1692,
            "tag_type": "LocationTag",
            "name": "san francisco",
            "display_name": "San Francisco"
        }]
}

这些是类:

case class User(
 var id: Int,
 var locations: Seq[Tag] = Seq.empty
)

case class Tag(
  id: Int,
  tag_type:String,
  name:String,
  display_name:String
)

如何设置可为空的“位置”格式?

implicit val format: Format[User] = (
    (__ \ 'id).format[Int] and
    (__ \ 'locations).formatNullable(Seq[Tag])
)

1 个答案:

答案 0 :(得分:9)

Format是一个不变的仿函数,因此您可以使用inmapOption[Seq[Tag]]格式更改为Seq[Tag]的格式:

import play.api.libs.functional.syntax._
import play.api.libs.json._

implicit val formatTag: Format[Tag] = Json.format[Tag]

implicit val formatUser: Format[User] = (
  (__ \ 'id).format[Int] and
  (__ \ 'locations).formatNullable[Seq[Tag]].inmap[Seq[Tag]](
    o => o.getOrElse(Seq.empty[Tag]),
    s => if (s.isEmpty) None else Some(s)
  )
)(User.apply, unlift(User.unapply))

在序列化没有位置的用户时,这不会产生locations值,但如果你想要一个空数组,那么你可以将第二个参数中的None更改为{{1转到inmap