Wygląda na to, że lift-json jest ograniczony do map, które mają łańcuchy jako klucze.Serializuj mapę, która nie ma łańcucha jako klucza z lift-json
Jaki jest najlepszy sposób na ominięcie tego ograniczenia?
Wygląda na to, że lift-json jest ograniczony do map, które mają łańcuchy jako klucze.Serializuj mapę, która nie ma łańcucha jako klucza z lift-json
Jaki jest najlepszy sposób na ominięcie tego ograniczenia?
Definiowanie własnego Serializer[Map[Any, Any]]
.
import net.liftweb.json._
import ext._
object MapSerializer extends Serializer[Map[Any, Any]] {
def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
case m: Map[_, _] => JObject(m.map({
case (k, v) => JField(
k match {
case ks: String => ks
case ks: Symbol => ks.name
case ks: Any => ks.toString
},
Extraction.decompose(v)
)
}).toList)
}
def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), Map[Any, Any]] = {
sys.error("Not interested.")
}
}
Następnie dodaj go do niejawnego Formats
zmiennej.
implicit val formats = DefaultFormats + MapSerializer
To wszystko.
W uzupełnieniu do poprzedniej odpowiedzi można zdefiniować zamiast:
def deserializowania (formatu niejawny: Formats): funkcja częściowa [(TypeInfo, JValue), Mapa [any, any]] = { mapie() }
Nie powoduje to żadnych innych deserializacji map roboczych.
Czy obiekty JSON nie są ograniczone do ciągów tylko dla kluczy? –
Tak, obiekty JSON są ograniczone do posiadania tylko ciągów dla kluczy. Są to, z praktycznego punktu widzenia, nazwy metod, więc pasują. –
Tak, moje pytanie brzmiało: jak możesz (de) serializować mapę, która nie ma ciągu jako klucza, ponieważ istnieje takie ograniczenie. – Atol