1

读完这个问题后

我想知道如何生成 a 的 JSON 值Directorate及其集合ServicesAreas。如果我们使用由我们提供的新 inception 机制,Play! 2.2我们只是格式化案例类 Directorate。

简单的答案是单独格式化案例类和列表(2 JSON AST)并使用 Play JSON API 将它们组合起来以构建一棵树?

非常感谢你的灯

更新 1: 当我写关于 combine 的时候,我在想 Write Combinators。Write[Directorate] and Write[Seq[ServicesArea]]? 或者,当使用 Slick 查询时,使用 Directorate 基本属性 + ServiceAreas 的 Seq 构建新案例类是否更容易?

4

1 回答 1

1

我会说您有两个不错的选择,并且与您使用 Slick 没有任何关系(这很好,您如何在数据库中存储内容不应该与您如何将其转换为某种序列化格式紧密结合,对吧? )。

您可以使用相应的类结构,使用案例类和 Json.format 宏来表示您所追求的 json 格式。您当然可以从“模型”类结构中创建一个单独的类层次结构,因为您可能希望以不同的方式构造事物,隐藏字段等。避免模型重构也可能很好,例如,更改属性名称会更改json 格式,特别是如果您有 json 的外部用户。

另一种选择是在一些通用数据结构中收集数据,比如 aList[(Directorate, Seq[ServicesArea])]或 aMap[(Directorate, Seq[ServicesArea])]并创建 aWrites[thattype]或者甚至像使用 json api 构建你想要的 json 格式一样简单,给定数据,如下所示:

...
JsArray(entries.map { case (directorate, serviceAreas) =>
  Json.obj(
    "somekey" -> directorate.someProp,
    "areas" -> JsArray(serviceAreas.map { area => 
      Json.obj(
        "areakey" -> area.something
      )}
  )
})
...

当然,使用组合器 api 来创建写入操作同样简单,可能更简洁,但更难理解(除非你以前使用过组合器 api),这只是实现相同想法的另一种方式。

...
implicit val serviceAreaWrites: Writes[ServiceArea] = (
  (__ \ "areakey").write[String] and 
  (__ \ "someotherkey").write[String]
)(unlift(ServiceArea.unapply)) 
// note that this must return the exact list of fields you have listed

implicit val directorateWrites: Writes[(Directorate, Seq[ServiceArea])] = (
  (__ \ "somekey").write[String] and 
  (__ \ "areas").write[Seq[ServiceArea]]
)(unlift(Tuple2.unapply[Directorate, Seq[ServiceArea]))

两者都不是“正确的(tm)”方式,您将不得不考虑每种方式在您的应用程序中的优缺点并选择最合适的方式。

祝你好运!

于 2013-11-09T21:26:33.933 回答