/ / Serialiaze mapę [A, B] z lift-json znającym A <-> Ciąg - json, scala, serializacja, lift-json

Serialiaze mapę [A, B] z lift-jsonem znającą A <-> String - json, scala, serializację, lift-json

Chcę serializować HashMap o typieHashMap [Coord, Unite] z lift-json. te typy są specyficzne dla mojego projektu, ale istnieje Coord -> String z funkcją toString i mogę odzyskać Coorda z String (nawet jeśli nie jest tu zakodowany, ale to nie jest istotne). Pomyślałem więc, że mogę poprosić lift-json o serializację mapy [String, Coord], ale tutaj serializuj (format) (y) spróbuj zastosować tę samą funkcję (w sposób rekurencyjny), gdy chcę, aby użyła funkcji serializacji dostosowanej do Mapa [ciąg, koordynacja]. Powodem, dla którego nie mogę wykonać transformacji poza Serializatorem, jest to, że ta HashMap jest częścią większej klasy przypadków, więc potrzebuję lift-json, aby wiedzieć, jak serializować i deserializować.

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)
}
}

}

Mógłbym przepisać serializację i deserializację mapy [String, Unite], ale byłoby to dużo niepotrzebnego kodu tylko dlatego, że nie rozumiem, jak lift-json działa wystarczająco.

Odpowiedzi:

1 dla odpowiedzi № 1

Być może czegoś mi brakuje, ale wydaje mi się, że tutaj chodzi o wykasowanie typu; w czasie wykonywania nie ma różnicy między HashMap[Coord, Unite] i HashMap[String, Unite], co może wyjaśniać niekończącą się rekurencję.