播放框架如何在scala中将对象解析为不同的结构

时间:2017-08-24 23:03:09

标签: json scala playframework

我有以下对象:

case class Person(id: Identifier, age: Int)
case class Identifier(value: String)

如果我使用默认Json.format,则value作为

内的属性
implicit val identifierJson = Json.format[Identifier]
implicit val PersonJson = Json.format[Person]

输出(解析为Json后):

{
    "id": {
        "value": "Foo"
    },
    "age": "20"
}

但是value属性对我来说似乎是多余的,我想要以下格式:

{
    "id": "Foo"
    "age": "20"
}

我应该如何编写自定义writes以获得正确的结果?

提前致谢。

2 个答案:

答案 0 :(得分:1)

import play.api.libs.json.{JsValue, Json, Writes}

case class Person(id: Identifier, age: Int)
case class Identifier(value: String)

implicit val writer = new Writes[Person]{
  def writes(o: Person): JsValue = Json.obj("id" -> o.id.value, "age" -> o.age)
}

Json.toJson(Person(Identifier("hi"), 5))

答案 1 :(得分:1)

Identifier类型与String包装器非常相似(BTW宁愿使其成为值类)。

JSON处理程序上提供了组合器:

val r: Reads[Identifier] = Json.reads[String].map(Identifier(_))
val w: Writes[Identifier] = Json.writes[String].transform { i: Identifier => i.value }