使用Jackson将Scala中的List [List]序列化为来自Scala的Json

时间:2011-09-06 21:18:01

标签: json scala jackson

我有一个案例类,我希望能够从JSON序列化和反序列化:

case class Foo(values: List[Any])

e.g。

Foo(List(new DateTime))

在这种情况下,DateTime被序列化为long,因此反序列化为Long而不是dateTime。

像这样:

{"values":[1315343106920]}

连连呢?我认为需要发生的是类的名称(例如DateTime)需要序列化,并在反序列化时检查。我可能放在值列表中的类型列表是有限的/小的。

也许是这样:

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

1 个答案:

答案 0 :(得分: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
  }