我有一个对象的数组列表。数组列表。 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对象映射器配置来执行此操作。任何帮助都将受到高度赞赏。
答案 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();
}