我有以下对象:
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
以获得正确的结果?
提前致谢。
答案 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 }