Parece que lift-json está limitado a los mapas que tienen cadenas como claves.Serializar un mapa que no tiene una cadena como clave con lift-json
¿Cuál es la mejor manera de eludir esta limitación?
Parece que lift-json está limitado a los mapas que tienen cadenas como claves.Serializar un mapa que no tiene una cadena como clave con lift-json
¿Cuál es la mejor manera de eludir esta limitación?
Defina su propio 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.")
}
}
luego añadirlo a la variable de Formats
implícita.
implicit val formats = DefaultFormats + MapSerializer
Eso es todo.
Además de la respuesta anterior se puede definir en su lugar:
def Deserialize (formato implícita: Formatos): función parcial [(TypeInfo, JValue), mapa [Any, Any]] = { mapa() }
Esto no interrumpe ninguna otra deserialización del mapa en funcionamiento.
¿No se limitan los objetos JSON a tener solo cadenas para las claves? –
Sí, los objetos JSON están limitados a tener solo cadenas para las claves. Son, como una cuestión práctica, los nombres del método, así que es apropiado. –
Sí, mi pregunta era cómo puede (de) serializar el mapa que no tiene cadena como clave ya que existe esta limitación. – Atol