【问题标题】:Serialize List[Any] to/from Json in Scala using Jackson使用 Jackson 将 List[Any] 序列化到/从 Scala 中的 Json
【发布时间】:2011-11-11 16:21:32
【问题描述】:

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

case class Foo(values: List[Any])

例如

Foo(List(new DateTime))

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

像这样:

{"values":[1315343106920]}

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

大概是这样的:

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

【问题讨论】:

    标签: json scala jackson


    【解决方案1】:

    我已经诉诸了看似蛮力的解决方案,只对 Jackson 进行手动序列化,例如

      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
      }
    

    【讨论】:

    猜你喜欢
    • 2014-08-30
    • 2021-06-11
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2019-01-20
    • 2013-08-04
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多