我会说您有两个不错的选择,并且与您使用 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)”方式,您将不得不考虑每种方式在您的应用程序中的优缺点并选择最合适的方式。
祝你好运!