/ / Serialiaze una mappa [A, B] con lift-json conoscendo A <-> String - json, scala, serialization, lift-json

Serialiaze una mappa [A, B] con lift-json conoscendo A <-> String - json, scala, serialization, lift-json

Voglio serializzare una HashMap di tipoHashMap [Coord, Unite] con lift-json. questi tipi sono specifici per il mio progetto ma c'è Coord -> String con la funzione toString e posso avere il mio Coord di nuovo da String (anche se non è codificato qui ma non è rilevante). Quindi ho pensato che potevo chiedere a lift-json di serializzare una mappa [String, Coord] ma qui serializzare (formato) (y) provare ad applicare la stessa funzione (in modo ricorsivo) quando voglio che usi la funzione serialize adattata a Mappa [String, Coord]. La ragione per cui non posso fare la trasformazione al di fuori del Serializer è perché questa HashMap fa parte di una case case più grande, quindi ho bisogno di lift-json per sapere come serializzare e deserializzare.

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

}

Potrei riscrivere la serializzazione e la deserializzazione di una mappa [String, Unite] ma sarebbe un codice inutile solo perché non capisco come lift-json funzioni abbastanza.

risposte:

1 per risposta № 1

Potrei mancare qualcosa, ma a me sembra che il problema qui sia la cancellazione del tipo; in fase di esecuzione, non c'è differenza tra HashMap[Coord, Unite] e HashMap[String, Unite], che potrebbe spiegare l'infinita ricorsione.