2011-09-06 9 views
5

Tengo una clase caso me gustaría ser capaz de serializar y deserializar de JSON:Lista Serialize [Cualquier] a/de JSON en Scala usando Jackson

case class Foo(values: List[Any]) 

por ejemplo,

Foo(List(new DateTime)) 

En este escenario, el DateTime consigue serializado como una larga, y por lo tanto como un deserializado largo en lugar de una fecha y hora.

De esta manera:

{"values":[1315343106920]} 

Sugerencias? Creo que lo que debe suceder es que el nombre de la clase (por ejemplo, DateTime) debe ser serializado y verificado en la deserialización. La lista de tipos que podría poner en la lista de valores es finita/pequeña.

Tal como esto:

{"values":[{"DateTime":1315343106920}]} 

Respuesta

0

he recurrido a lo que parece ser una solución de fuerza bruta para hacer la serialización solo manual con Jackson, por ejemplo,

def serializeNode(foo: Foo, mapper: ObjectMapper): JsonNode = { 
    val n = mapper.createObjectNode() 

    val valuesNode = mapper.createArrayNode() 
    n.put("values", valuesNode) 
    foo.values.foreach { value => 
     val nd = mapper.createObjectNode 

     value match { 
     case intValue: Int => nd.put("int", intValue) 
     case decimalValue: BigDecimal => nd.put("decimal", decimalValue.bigDecimal) 
     case booleanValue: Boolean => nd.put("boolean", booleanValue) 
     case strValue: String => nd.put("string", strValue) 
     case dtValue: DateTime => nd.put("datetime", _dtFmt.print(dtValue))   
     case _ => sys.error("Unexpected value type: " + value) 
     } 
     valuesNode.add(nd) 
    } 
    n 
    } 

    def serialize(foo: Foo): String = { 
    val out = new StringWriter 
    val generator = new JsonFactory().createJsonGenerator(out) 
    val mapper = new ObjectMapper 
    generator.setCodec(mapper) 

    generator.writeTree(serializeNode(foo, mapper))  
    out.toString 
    } 
+1

No estoy seguro si me ayudaría, pero Jerkson [https://github.com/codahale/jerkson] es una extensión de Scala-específica de Jackson, y podría manejar este caso mejor que la llanura Jackson? También hay un módulo de extensión de Jackson [https://github.com/FasterXML/jackson-module-scala] que también intenta mejorar el uso específico de Scala. – StaxMan

Cuestiones relacionadas