2011-09-06 8 views
5

を使用して、私はシリアライズとJSONから逆シリアル化できるようにしたいと思いますケースクラスを持っている:Serializeを一覧[任意]に/ ScalaではJSONからジャクソン

case class Foo(values: List[Any]) 

例えば

Foo(List(new DateTime)) 

このシナリオでは、DateTimeはlongとしてシリアル化されるため、dateTimeではなくLongとしてシリアル化されます。

{"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]ジャクソンのScalaの固有の拡張機能があり、プレーン・ジャクソンよりも優れたこのケースを扱うのでしょうか?同様にスカラー固有の使い方を改善することを目的としたJackson拡張モジュール[https://github.com/FasterXML/jackson-module-scala]もあります。 – StaxMan

関連する問題