Sembra che lift-json sia limitato alle mappe che hanno stringhe come chiavi.Serializzare una mappa che non ha una stringa come chiave con lift-json
Qual è il modo migliore per superare questa limitazione?
Sembra che lift-json sia limitato alle mappe che hanno stringhe come chiavi.Serializzare una mappa che non ha una stringa come chiave con lift-json
Qual è il modo migliore per superare questa limitazione?
Definire il proprio 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.")
}
}
quindi aggiungerlo alla Formats
variabile implicita.
implicit val formats = DefaultFormats + MapSerializer
Questo è tutto.
Oltre alla risposta precedente è possibile definire invece:
def deserializzare (formato implicita: Formati): funzione parziale [(TypeInfo, JValue), Mappa [Qualsiasi, Qualsiasi]] = { Mappa() }
Ciò non interrompe qualsiasi altra deserializzazione della mappa di lavoro.
Gli oggetti JSON non hanno solo stringhe per le chiavi? –
Sì, gli oggetti JSON sono limitati ad avere solo stringhe per le chiavi. Sono, in pratica, i nomi dei metodi, quindi è appropriato. –
Sì, la mia domanda era come si può (de) serializzare la mappa che non ha lo string come chiave poiché c'è questa limitazione. – Atol