如何使用Java Jackson重命名JSON的根密钥?

时间:2011-11-07 09:53:19

标签: java jackson

我正在使用Scala的Jackson 1.9.1将对象编组为JSON。我的编组代码如下所示:

val mapper = new ObjectMapper()

mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true)
mapper.setPropertyNamingStrategy(new PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy())

val introspectorPair = new AnnotationIntrospector.Pair(
  new JacksonAnnotationIntrospector(),
  new JaxbAnnotationIntrospector()
)
mapper.getSerializationConfig().withAnnotationIntrospector(introspectorPair)

val writer = mapper.defaultPrettyPrintingWriter
writer.writeValueAsString(this)

这产生的典型JSON看起来像这样:

{
  "SalesOrder" : {
    "id" : "3187e7d0-f84f-11e0-be50-0800200c9a66",
    "total_paid" : 8.99,
    "created_at" : "2011-05-14T00:00:00.000+0300",
    "updated_at" : "2011-05-14T00:00:00.000+0300"
  }
}

我的问题是:如何将根密钥从“SalesOrder”重命名为更适合JavaScript的“sales_order”?在我的类定义之上添加JsonProperty覆盖不起作用 - 可能是因为根密钥不是严格的属性(因此也setPropertyNamingStrategy()也没有应用)?

任何关于如何实现这一目标的指导感激不尽!

1 个答案:

答案 0 :(得分:4)

你可以使用JAXB注释@XmlRootElement(使用JaxbAnnotationIntrospector,你在这里),或杰克逊自己的@JsonRootName(在org.codehaus.jackson.map.annotate1中)。

或者,如果您想在没有注释的情况下执行此操作,也可以对AnnotationIntrospector中的一个进行子类化并覆盖findRootName(...)方法 - 这就是要使用的名称,通常来自注释,但您可以实现任何你想要的自定义逻辑。