2011-09-06 47 views
5

我有一個案例類,我想能夠序列化和反序列化JSON:序列化列表[任何] /從Json的Scala中使用傑克遜

case class Foo(values: List[Any]) 

例如

Foo(List(new DateTime)) 

在這種情況下,DateTime被序列化爲一個long,因此反序列化爲Long而不是dateTime。

像這樣:

{"values":[1315343106920]} 

建議?我認爲需要發生的是類的名稱(例如DateTime)需要序列化出來,並檢查反序列化。我可能放在值列表中的類型列表是有限/小的。

也許是這樣的:

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

回答

0

我使出什麼似乎像一個蠻力解決方案只是做手工系列化與傑克遜,例如

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

不知道是否會有所幫助,但Jerkson [https://github.com/codahale/jerkson]是傑克遜的特定斯卡拉擴展,並且可以處理這種情況下比普通傑克遜更好?還有傑克遜擴展模塊[https://github.com/FasterXML/jackson-module-scala],同樣旨在改善特定於scala的用法。 – StaxMan