泽西杰克逊的根名称来自ArrayList

时间:2014-07-12 07:43:16

标签: jaxb jersey jackson

我有一个对象的数组列表。数组列表。 Employee类使用@XMLRootElement注释(name =" employees")。我使用jersey 1.8.1,Jackson 1.9.2和POJOMappingFeature。响应就像

{
    ArrayList: [{name: John, age: 28}, {name: Mike, age:29}]
}

如何让jackson在json响应中显示正确的根名称(employees)。我也尝试在Employee类上使用@JsonName(value =" employees")。我需要在不使用带有属性List的EmployeeListWrapper之类的列表包装器的情况下执行此操作。我希望得到像

这样的回复
{
    employees: [{name: John, age: 28}, {name: Mike, age:29}]
}

是否可以使用任何jackson对象映射器配置来执行此操作。任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:2)

您可能无法通过@XMLRootElement@JsonRootName注释实现此目的,因为注释必须放在ArrayList类本身上。由于您需要在没有任何收集包装的情况下执行此操作,因此您必须直接使用Jackson ObjectMapper

映射器提供对ObjectWriter构建器

的访问
  

构建器对象,可用于序列化参数的每序列化配置,例如要使用的JSON视图和根类型。

作者有withRootName()方法就是你所需要的。

  

使用配置构造新实例的方法,该配置指定用于“根元素包装”的根名称。

请参阅下面的代码段。

ObjectWriter writer = ObjectMapper.writer().withRootName("employees");
writer.writeValueAsString(employees);

答案 1 :(得分:0)

默认情况下,杰克逊可能无法识别JAXB annotations,但您可以自定义the object mapper来执行此操作。

如果您想坚持杰克逊注释,可以使用@JsonRootName来表示用于根级别包装的名称。

答案 2 :(得分:0)

另一种选择是覆盖JaxbAnnotationIntrospector中的方法findRootName()并在ObjectMapper中使用它。

所以代码看起来像:

@Override
public String findRootName(AnnotatedClass ac) {
    // will return "employees" for @XmlType(name = "employees")
    // Or you can return the class name itself
    return ac.getAnnotations().get(XmlType.class).name();
}

参考:Customizing root name in Jackson JSON provider