Playframework 多重json序列化格式
据我所知,Json组合器的优点之一是,您可以使用相同的模型,但通过使用不同的组合器生成不同的Json格式。今天我找到了一个用于此的用例,但似乎无法使其正常工作Playframework 多重json序列化格式,playframework,playframework-2.2,Playframework,Playframework 2.2,据我所知,Json组合器的优点之一是,您可以使用相同的模型,但通过使用不同的组合器生成不同的Json格式。今天我找到了一个用于此的用例,但似乎无法使其正常工作 case class Person(firstName: String, lastName: String, city: String) object Person { implicit val writes = ( (__ \ "firstName").write[String] ~ (__ \ "lastName
case class Person(firstName: String, lastName: String, city: String)
object Person {
implicit val writes = (
(__ \ "firstName").write[String] ~
(__ \ "lastName").write[String] ~
(__ \ "city").write[String])(unlift(Person.unapply))
val cityWrites = (
(__ \ "city").write[String])(unlift(Person.unapply))
}
上面的定义给了我编译错误,因为nameWrites与case类定义不匹配。我可能可以创建一个构造函数重写(this(lastName:String)),但它对模型类没有意义。第二个Json的目的只是看看我们在哪些城市有客户
我能影响这里的无电梯操作吗?我似乎找不到关于它的文档。我和你一样对
unlift()
一无所知,但从它的类型签名来看:
def unlift[A, B](f : (A) => Option[B]) : (A) => B
它似乎需要一个函数,在您试图编写的字段周围返回一个选项。
因此:
应该为cityWrites
案例执行此技巧
事实上,只要把这些东西弄得乱七八糟,我就可以做一个namewits
(我猜你想把名字和姓氏写成JSON),而不需要使用不合适的:
val nameWrites = (
(__ \ "firstName").write[String] ~
(__ \ "lastName").write[String])( (p:Person) => (p.firstName, p.lastName) )
我想这看起来也很清楚
编辑:以下是如何将其用作隐式来编写人
对象列表:
object Person {
val nameWrites = (
(__ \ "firstName").write[String] and
(__ \ "lastName").write[String])( (p:Person) => (p.firstName, p.lastName) )
}
...
val p1 = Person("John", "Smith", "Dallas")
val p2 = Person("Bob", "Smith", "Dallas")
val p3 = Person("Tom", "Smith", "Dallas")
val personList = List(p1, p2, p3)
implicit val nWrites: Writes[Person] = Person.nameWrites
println(Json.toJson(personList))
那我就同意了:
val cityWrites: Writes[Person] = new Writes[Person] {
def writes(o: Person) = JsString(o.city)
}
然后使用它:
val serialized = Json.toJson(List[Person]())(Writes.list(cityWrites))
尽管如此,我相信在这种情况下最好的是,因为它不包含重复项:
Json.toJson(List[Person]().map(_.city).distinct)
但是我猜你想用格式来播放,对吗?非常感谢。这适用于Json写入。但是,现在返回类型已从Writes[Person]更改为Writes[String,String],如您的namewits示例中所示,我应该如何从Json.toJson使用它。我使用了Json.toJson(personList)(nameswrites)
,它在Writes[Person]和Writes[String,String]之间的兼容性上给了我编译错误。当我使用Json.toJson(personList.map((p:Person)=>(p.firstName,p.lastName))(nameswrites)
时,写入[String,String]和写入[List[String,String]]之间会出现兼容性错误。再次感谢,非常感谢。是的,这也行。“我的真实案例实际上是试图返回多个元素,但是的,对于单个元素,您的更容易。”SuriyantoLee更新了我的答案
Json.toJson(List[Person]().map(_.city).distinct)