Playframework 多重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

据我所知,Json组合器的优点之一是,您可以使用相同的模型,但通过使用不同的组合器生成不同的Json格式。今天我找到了一个用于此的用例,但似乎无法使其正常工作

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)