使用lift-json知道< - > String序列化地图[A,B]

时间:2012-07-09 04:58:37

标签: json scala serialization lift-json

我想用lift-json序列化一个HashMap类型为[Coord,Unite]的HashMap。那些类型是我的项目特有的,但有Coord - >带有toString函数的字符串,我可以从String返回我的Coord(即使它没有在这里编码,但这不相关)。 所以我想我可以请求lift-json序列化Map [String,Coord]但是这里序列化(格式化)(y)尝试应用相同的函数(以递归方式),当我希望它使用serialize函数适应时地图[字符串,坐标。我不能在Serializer之外进行转换的原因是因为这个HashMap是一个更大的case类的一部分所以我需要lift-json知道如何序列化和反序列化它。

class UnitzSerializer extends Serializer[HashMap[Coord,Unite]] {

private val UnitzClass = classOf[HashMap[Coord,Unite]]

def deserialize(implicit format:Formats): PartialFunction[(TypeInfo,JValue), HashMap[Coord,Unite]]= {
case (TypeInfo(UnitzClass,_), json) => json match {
  case x:JValue => (deserialize(format)((TypeInfo(classOf[Map[String,Unite]],None),x))).map(y => (Coord(0,0),y._2))
  case _  => throw new Exception("ONOz")
}
}


def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
       case x: HashMap[Coord,Unite] => {
     val y:Map[String,Unite] = x.map(z => (z._1.toString,z._2))
 serialize(format)(y)
   }
}

}

我可以重写Map [String,Unite]的序列化和反序列化,但这只会是很多无用的代码,因为我不理解lift-json是如何工作的。

1 个答案:

答案 0 :(得分:1)

我可能会遗漏一些东西,但在我看来,这里的问题是类型擦除;在运行时,HashMap[Coord, Unite]HashMap[String, Unite]之间没有区别,这可以解释无休止的递归。