Playframework,将Json Writes和Reads放在何处重用?

时间:2016-03-18 11:15:04

标签: scala playframework playframework-2.0

我有两个控制器编写和读取相同的AccountModel案例类。此类是我的“域”对象Account的适配器,它将一些集合展平并将对象引用(Map[Role, Auth])转换为显式键引用(Set[AuthModel(rolekey:String, level:Int)])。

我想重用这个AccountModel及其含义WritesReads,但不知道如何实现“scala方式”。

我会在object Models中说我的案例类作为内部类和所有相关的含义,但我认为这很快就会变得难以理解。


你曾经做过什么,在哪里放置可重复使用的Json课程,你有什么建议吗?

非常感谢

1 个答案:

答案 0 :(得分:4)

主要有两种方法。

方法1:将它们放在可序列化对象的伴随对象上:

// in file AccountModel.scala
class AccountModel(...) {
  ...
}

object AccountModel {
  implicit val format: Format[AccountModel] = {...}
}

这样,无论您导入AccountModel的哪个位置,格式化程序也都可用,因此一切都可以无缝运行。

方法2:使用JSON格式化程序准备特征:

// in a separate file AccountModelJSONSupport.scala
import my.cool.package.AccountModel

trait AccountModelJsonSupport {
  implicit val format: Format[AccountModel] = {...}
}

无论何时需要序列化,都需要使用此方法,您必须混合特征,如下所示:

object FirstController extends Controller with AccountModelJsonSupport {
  // Format[AccountModel] is available now:
  def create = Action(parse.json[AccountModel]) { ... }
}
编辑:我忘了添加两种方法的比较。我通常坚持接近1,因为它更直接。但是,如果您需要为同一个类使用两个不同的格式化程序,或者当您的模型类不是您自己的并且您无法修改它时,则需要JSONSupport mixin策略。感谢您在评论中指出它。