Отформатируйте обнуляемый Seq или список объектов с помощью Play Json и Salat

Я хочу преобразовать json в модель Salat. Я использую Play 2.X Scala Json. Я не смог найти никакой документации для форматирования Nullable Seq. Согласно https://github.com/novus/salat/wiki/SupportedTypes, я нельзя использовать 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])
)

person angelokh    schedule 23.03.2015    source источник


Ответы (1)


Format — это инвариантный функтор, поэтому вы можете использовать inmap для изменения формата Option[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 во втором аргументе на inmap на Some(Seq.empty).

person Travis Brown    schedule 23.03.2015