我有两个控制器编写和读取相同的AccountModel
案例类。此类是我的“域”对象Account
的适配器,它将一些集合展平并将对象引用(Map[Role, Auth]
)转换为显式键引用(Set[AuthModel(rolekey:String, level:Int)]
)。
我想重用这个AccountModel
及其含义Writes
和Reads
,但不知道如何实现“scala方式”。
我会在object Models
中说我的案例类作为内部类和所有相关的含义,但我认为这很快就会变得难以理解。
你曾经做过什么,在哪里放置可重复使用的Json课程,你有什么建议吗?
非常感谢
答案 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策略。感谢您在评论中指出它。