/ / Serialiaze mapu [A, B] pomocou A-B reťazca so znalosťou A <-> Reťazec - json, scala, serializácia, lift-json

Serializujte mapu [A, B] s výťahom, pretože poznáme A <-> String - json, scala, serializáciu, lift-json

Chcem serializovať typ HashMapHashMap [Coord, Unite] s výťahom json. tieto typy sú špecifické pre môj projekt, ale existuje funkcia Coord -> String s funkciou toString a môžem mať svoj Coord späť z reťazca (aj keď to nie je kódované tu, ale to nie je relevantné). Takže som si myslel, že by som mohol požiadať-zdvih-json, aby serializoval mapu [String, Coord], ale tu serializujem (formát) (y), pokúsim sa použiť rovnakú funkciu (rekurzívnym spôsobom), keď chcem, aby použila funkciu serializácie prispôsobenú mapa [String, Coord]. Dôvod, prečo nemôžem vykonať transformáciu mimo Serializer, je ten, že tento HashMap je súčasťou väčšej triedy prípadov, takže musím vedieť, ako ho serializovať a deserializovať, zdvihnúť 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)
}
}

}

Mohol by som prepísať serializáciu a deserializáciu mapy [String, Unite], ale to by bolo veľa zbytočného kódu len preto, že nerozumiem tomu, ako funguje technológia lift-json.

odpovede:

1 pre odpoveď č. 1

Možno mi niečo chýba, ale zdá sa mi, že tu ide o vymazanie typu; v čase behu nie je žiadny rozdiel medzi HashMap[Coord, Unite] a HashMap[String, Unite], čo môže vysvetliť nekonečné opakovanie.