播放2.1.2:杰克逊似乎不支持@JsonTypeInfo

时间:2013-08-03 14:10:14

标签: json scala playframework

这里非常简单的场景。我有:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@type")
class Thing(val id: Int) 

...

class LowerThing(id: Int) extends Thing(id) 

(我为这两个类定义了Json.read和Json.writes,以及必要的apply / unapply方法(这些方法直截了当 - 就像它们是case类一样。)

在控制器中,我有一个帖子:

    request =>
      val thing = request.body.asJson.get.as[Thing]

我可以发布这样的JSON:

{"@type":"com.foo.LowerThing","id":1}

或任何其他子类,但Jerkson总是给我一个直接的东西。

此外,当序列化事物时,不包括@type,使客户端无法在另一端实例化正确类型的对象。

请注意,几乎完全相同的代码可以在Java EE服务器下与Jackson一起使用。甚至是旧版本的杰克逊。

(我试图证明从Java EE转移到所有Scala& Play是合理的。在大多数情况下,它变得很精彩,但是这样的事情必须付诸实施。对我们来说真的很遗憾处理我们自己的多态JSON序列化 - 必须有一种方法可以做到这一点,但我找不到它。而且我很困惑为什么这不仅仅起作用,因为杰克逊是杰克逊。)

1 个答案:

答案 0 :(得分:0)

嗯,我能够直接使用Jackson API来解决问题:

  val mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY)
  mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)
  val thing = mapper.readValue(request.body.asJson.get.toString, classOf[Thing])

让我觉得Play的JSON库可能没有以我熟悉的方式使用Jackson - 如果它们是一个无法使用的,那么Json读/写的应用/不应用可以使用

我不想使用这种机制因为使不可变对象变得困难或不可能,所以我仍然感谢有人向我演示如何直接使用Play的JSON库实现多态JSON反序列化。