如何使用javajackson重命名JSON的根键?

如何使用javajackson重命名JSON的根键?,java,jackson,Java,Jackson,我正在使用Jackson 1.9.1,从Scala到marshall对象再到JSON。我的编组代码如下所示: val mapper = new ObjectMapper() mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true) mapper.setPropertyNamingStrategy(new PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy()

我正在使用Jackson 1.9.1,从Scala到marshall对象再到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)
{
  "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"
  }
}
生成的典型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)
{
  "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友好的SalesOrder?在我的类定义上方添加JsonProperty重写不起作用-可能是因为根键不是严格意义上的属性,因此也没有应用SetPropertyNamegStrategy


对于如何实现这一目标的任何指导,我们都深表感激

在使用JaxbAnnotationIntrospector时,您可以使用JAXB annotation@XmlRootElement,也可以在org.codehaus.Jackson.map.annotate1中使用Jackson自己的@JsonRootName


或者,如果您想在没有注释的情况下完成此操作,也可以将AnnotationIntrospector的一个子类化,并覆盖findRootName。。。方法-这是确定要使用的名称的方法,通常是通过注释,但您可以实现您想要的任何自定义逻辑。

您可以在使用JaxbAnnotationIntrospector时使用JAXB annotation@XmlRootElement,也可以在org.codehaus.Jackson.map.annotate1中使用Jackson自己的@JsonRootName


或者,如果您想在没有注释的情况下完成此操作,也可以将AnnotationIntrospector的一个子类化,并覆盖findRootName。。。方法-这是确定要使用的名称的方法,通常是通过注释,但您可以实现任何您想要的自定义逻辑。

谢谢@StaxMan,这非常有效。我选择了@XmlRootElement选项。谢谢@StaxMan,效果很好。我选择了@XmlRootElement选项。