我有一个Map,它由元组(String,CaseClass1)
作为键和元组(CaseClass2,CaseClass3)
作为值组成。
我为每个case类创建了隐式的writer:
implicit val caseClass1Writes = Json.writes[CaseClass1]
implicit val caseClass2Writes = Json.writes[CaseClass2]
implicit val caseClass3Writes = Json.writes[CaseClass3]
我尝试创建另一个case类,它包含所有这些元组
TupleCaseClass(key:(String,CaseClass1),value:(CaseClass2,CaseClass3))
,然后为这个类创建隐式写入器,但结果仍然是相同的:(
No Json serializer found for type Map[(String,CaseClass1),(CaseClass2,CaseClass3)]. Try to implement an implicit Writes or Format for this type.
由于您的TupleCaseClass
中有元组,Play并不隐式地理解如何编写此内容(没有明显的方法来编写两个自定义对象的元组)。您必须提供另外两个隐式来处理元组,例如
implicit val keyWrites = new Writes[(String, CaseClass1)]{
def writes(o: (String, CaseClass1)) = Json.obj(o._1 -> o._2)
}
implicit val valueWrites = new Writes[(CaseClass2, CaseClass3)]{
def writes(o: (CaseClass2, CaseClass3)) = Json.obj("caseClass2" -> o._1, "caseClass3" -> o._2)
}
不幸的是,我没有其他选择,只能编写一个隐式方法,将Map[(String,CaseClass1),(CaseClass2,CaseClass3)]
转换为List[TupleCaseClass]
val map:Map[(String,CaseClass1),(CaseClass2,CaseClass3)] = some map
可以使用foldLeft方法轻松转换为case类列表
val list:List[TupleCaseClass] = map.foldLeft(List[TupleCaseClass]()){(l,t)=>l :+ ToupleCaseClass(t._1,t._2)}
然后是Json.toJson(list)
这个解决方案很难看,我希望Json解析器能够处理像元组或映射这样的基本结构。
希望对将来的人有所帮助。