保留Jackson生成的JSON中的根元素名称

时间:2013-02-06 12:51:05

标签: java json jackson

我正在使用Jackson 1.9.7从我的Java对象生成一些JSON。

以下是将对象序列化为JSON的方法:

public String constructJson(Object object)
        throws EvaluationException {
    try {

        objectMapper.setSerializationConfig(
                objectMapper.getSerializationConfig()
                        .withSerializationInclusion(JsonSerialize.Inclusion.NON_NULL)
                        .withSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY)
                        .with(SerializationConfig.Feature.WRAP_ROOT_VALUE)
        );

        return objectMapper.writeValueAsString(object);

    } catch (IOException e) {
        LOGGER.error("Error", e);
        throw new EvaluationException("Error", e);
    }
}

我正在传递从XSD架构生成的java对象,但具有@XmlRootElement注释。有没有办法告诉杰克逊保留该物品的名称?

目前它产生的是:

{"": {
    "generatedId": "EA7EB141D9454433B5E24F374BF25118",....

虽然它应该是:

{"theNameOfTheRoot": {
    "generatedId": "EA7EB141D9454433B5E24F374BF25118",....

我作为root传递给对象映射器的类看起来像这样:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "EvaluationType", propOrder = {
    "generatedId",
    "style",
    "status",
    "candidate",
    "texts",
    "evaluationParts"
})
public class EvaluationType {
   .....
}

所以也许有办法告诉杰克逊从@XmlType注释中取名?有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

如果您在类定义的顶部放置@XmlRootElement(name="EvaluationType"),则应提供名称。或者您是说由于某种原因无法向您的班级添加@XmlRootElement

<强>更新

如果没有@XmlRootElement,杰克逊2将使用JSON密钥的类名。 Jackson 2需要一组新的maven依赖项,特别是:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.1.3</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.1.2</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.1.3</version>
</dependency>

答案 1 :(得分:0)

用于2.6版本,如下所示

ObjectMapper objectMapper = new ObjectMapper();
JaxbAnnotationModule module = new JaxbAnnotationModule();
objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE,true);      
objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE,true);