使用 Play Json 和 Salat 格式化可为空的 Seq 或对象列表
Format nullable Seq or List of objects with Play Json and Salat
我想将 json 转换为礼拜模式。我正在使用 Play 2.X Scala Json。我找不到任何文档来格式化可为空的 Seq。根据 https://github.com/novus/salat/wiki/SupportedTypes,我不能使用 Option[Seq] 或 Option[List]。
下面的json很好,但有时'locations'会漏掉
{
"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
)
如何格式化可为空 'locations'?
implicit val format: Format[User] = (
(__ \ 'id).format[Int] and
(__ \ 'locations).formatNullable(Seq[Tag])
)
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)
.
我想将 json 转换为礼拜模式。我正在使用 Play 2.X Scala Json。我找不到任何文档来格式化可为空的 Seq。根据 https://github.com/novus/salat/wiki/SupportedTypes,我不能使用 Option[Seq] 或 Option[List]。
下面的json很好,但有时'locations'会漏掉
{
"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
)
如何格式化可为空 'locations'?
implicit val format: Format[User] = (
(__ \ 'id).format[Int] and
(__ \ 'locations).formatNullable(Seq[Tag])
)
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)
.