2012-07-08 6 views
5

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?

+0

¿No se limitan los objetos JSON a tener solo cadenas para las claves? –

+0

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. –

+0

Sí, mi pregunta era cómo puede (de) serializar el mapa que no tiene cadena como clave ya que existe esta limitación. – Atol

Respuesta

5

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.

0

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.

Cuestiones relacionadas