Scala -序列化Map[(String,CaseClass1),(CaseClass2,CaseClass3)]到J



我有一个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解析器能够处理像元组或映射这样的基本结构。

希望对将来的人有所帮助。

最新更新