![](/img/trans.png)
[英]JAX-RS/Jackson — Deserialize JSON with Unknown Root Element Name?
[英]Jersey Jackson root name coming as ArrayList
我有一个对象数组列表。 数组列表。 Employee类使用@XMLRootElement(name =“ employees”)进行注释。 我使用球衣1.8.1,杰克逊1.9.2和POJOMappingFeature。响应就像
{
ArrayList: [{name: John, age: 28}, {name: Mike, age:29}]
}
我如何让杰克逊在json响应中显示正确的根名称(员工)。 我也尝试在Employee类上使用@JsonName(value =“ employees”)。 我需要不使用带有属性List的EmployeeListWrapper之类的列表包装器来执行此操作。 我想得到这样的回应
{
employees: [{name: John, age: 28}, {name: Mike, age:29}]
}
是否可以使用任何杰克逊对象映射器配置来执行此操作。 任何帮助将不胜感激。
您可能无法使用@XMLRootElement
或@JsonRootName
批注实现此目的,因为批注必须放在ArrayList
类本身上。 并且由于您需要在没有任何集合包装的情况下进行操作,因此您将不得不直接使用Jackson ObjectMapper
。
映射器提供对ObjectWriter
构建器的访问,
可以用于序列化参数(例如JSON View和要使用的根类型)的按序列化配置的Builder对象。
并且作者具有您需要的withRootName()
方法。
用配置构造新实例的方法,该配置指定用于“根元素包装”的根名称。
请参见下面的代码段。
ObjectWriter writer = ObjectMapper.writer().withRootName("employees");
writer.writeValueAsString(employees);
默认情况下,Jackson可能无法识别JAXB批注,但是您可以自定义对象映射器来执行此操作。
如果要坚持使用Jackson批注,则可以使用@JsonRootName指示用于根级包装的名称。
另一种选择是在重写方法findRootName() JaxbAnnotationIntrospector并使用该内部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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.