当前位置: 首页 > 知识库问答 >
问题:

Jersey Jackson的根名称为ArrayList

甄阳朔
2023-03-14

我有一个对象数组列表。数组列表。Employee类是用@ xmlroot element(name = " employees ")注释的。我用的是球衣1.8.1,杰克逊1.9.2带POJOMappingFeature。人们的反应是

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

如何使杰克逊在json响应中显示正确的根名称(员工)。我也尝试在员工类上使用@JsonName(值=“员工”)。我需要在不使用列表包装器(如具有属性列表的雇员列表包装器)的情况下执行此操作。我希望得到这样的回应

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

使用任何jackson对象映射器配置都可以做到这一点吗?任何帮助都将不胜感激。

共有3个答案

范建华
2023-03-14

另一种选择是重写JaxbAnnotationINEURSPECtor中的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();
}

参考:在Jackson JSON提供程序中自定义根名称

闾丘坚诚
2023-03-14

默认情况下,Jackson可能无法识别JAXB注释,但是您可以定制对象映射器来实现这一点。

如果您想坚持Jackson注释,您可以使用@JsonRootName来指示用于根级包装的名称。

韩高峯
2023-03-14

使用< code>@XMLRootElement或< code>@JsonRootName批注可能无法实现这一点,因为批注必须放在< code>ArrayList类本身上。由于您需要在没有任何集合包装器的情况下这样做,那么您将不得不直接使用Jackson < code > object mapper 。

映射器提供对对象编写器生成器的访问,

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

作者有with RootName()方法,这就是您需要的。

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

请参阅下面的代码段。

ObjectWriter writer = ObjectMapper.writer().withRootName("employees");
writer.writeValueAsString(employees);
 类似资料:
  • 如何在Android Studio 0.9.9中更改项目根目录的名称。我在这里阅读了其他解决方案,但对我来说没有任何效果。我可以更改/重构包名称,但不能更改根目录的名称。我在这里找到了另一个解决方案,即更改文件中的名称,但没有成功。更改名称后,我尝试了清理、重建等,但没有任何东西反映Android Studio中的更改。“PROJECT NAME/ROOT DIRECTORY NAME”没有REF

  • 我有一个2010年和2019年的土地覆盖类型的数据框架。Pland代表总的土地覆盖价值,1等于该特定区域相对于ID的100%。这些计算是事先进行的,id代表每个几何形状。 我想执行一个函数,该函数生成另一个具有以下描述性名称的列,其中表示要替换的名称: 可复制代码:

  • 问题内容: 我正在将SpringMVC用于Web应用程序以及为Hibernate注入sessionFactory。 运行我的应用程序时,出现以下错误… 我不确定为什么autoInject无法正常工作。我已将所有XML配置放入servlet上下文中… userManagementController的代码是… userService是userService.java … 由…使用 谁能给我任何指示?

  • 我正在运行一个Spring boot MVC应用程序,在我的控制器中有一个@RequestParameter,其值为“status”。当我通过请求映射(例如http://localhost:8080/pathToMethod?status=someStatus 失败,错误如下: 字段'status'上的对象'ModelAndView'中的字段错误:拒绝值[Soeming];代码[typeMisma

  • 如何在某个模板类的基础上,通过写死(绑定)部分模板参数类型,来定制出一个新的模板类? 尝尝我这种写法如何: template<class T> // 采用了自定义内存分配器的std::vector using Vec = std::vector<T,My_alloc<T>>; // 使用My_alloc为元素分配存储空间 Vec<int> fib = { 1, 2, 3, 5, 8, 13 };

  • 问题内容: Sun / Oracle JDK在java.util包中公开了一个用于创建类型3(基于名称)的UUID的函数:java.util.UUID.nameUUIDFromBytes(byte [] name)。 我需要能够使用nameUUIDFromBytes在Java中生成类型3 UUID,并在创建另一种语言的类型3 UUID时达到相同的UUID,假设我提供与源相同的字节。 根据javad