Сериализировать список [Any] в / из Json в Scala, используя Джексона - PullRequest
5 голосов
/ 07 сентября 2011

У меня есть класс дел, который я хотел бы иметь возможность сериализации и десериализации из JSON:

case class Foo(values: List[Any])

например,

Foo(List(new DateTime))

В этом сценарии DateTimeсериализуется как long, и, следовательно, десериализуется как Long, а не как dateTime.

Как это:

{"values":[1315343106920]}

Предложения?Я думаю, что должно произойти, это то, что имя класса (например, DateTime) должно быть сериализовано и проверено на десериализацию.Список типов, которые я мог бы добавить в список значений, является конечным / небольшим.

Возможно, вот так:

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

1 Ответ

0 голосов
/ 08 сентября 2011

Я прибег к тому, что кажется грубым решением, просто выполняя ручную сериализацию с Джексоном, например

  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
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...