java - 使用 Jackson 将 Java 对象序列化为 JSON 时抑制包装器对象

标签 java json spring jackson

我有一个以 JSON 格式返回列表的 Web 服务。它使用 Jackson 将 Java POJO 列表映射到 JSON。问题是 JSON 表示在数组周围有一个包装器对象,而我只想要数组。即,我得到这个:

{"optionDtoList":[{...}, ..., {...}]}

当我真正想要的是:

[{...}, ..., {...}]

我是直接序列化Java List;我没有用包装对象包装 List 并序列化包装对象。似乎是 Jackson 添加了 JavaScript 包装器对象。

我假设我可以在 POJO 上使用一些注释来抑制包装器对象,但我没有看到它。

解决方案的约束

我想在服务端解决这个问题,而不是剥离客户端的包装。客户端是一个 jQuery UI 小部件(自动完成小部件,无关紧要),它需要一个简单的数组,我不想修改小部件本身。

我尝试过的

  • 我尝试用 Java POJO 数组替换 Java POJO 列表,结果是一样的。
  • 我尝试了 @JsonTypeInfo(use = Id.NONE) 认为这可能会抑制包装器,但事实并非如此。

最佳答案

在我运行时处于测试模式:

org.codehaus.jackson.map.ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper();
String json = mapper.writeValueAsString( Arrays.asList("one","two","three","four","five") );
System.out.println(json);

返回:

["one","two","three","four","five"]

您期望的行为是正确的?

我可以看到,当我通过 Spring Controller 返回此列表并让 MappingJacksonJsonView 处理将列表转换为 json 时,是的,它周围有一个包装器,它告诉我 MappingJacksonJsonView 是添加包装器的那个。一种解决方案是从您的 Controller 显式返回 json,例如:

    @RequestMapping(value = "/listnowrapper")
public @ResponseBody String listNoWrapper() throws Exception{       
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(Arrays.asList("one","two","three","four","five")); 
}

关于java - 使用 Jackson 将 Java 对象序列化为 JSON 时抑制包装器对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4765570/

相关文章:

java - 使用扫描仪多次从输入流读取内容的行为不符合预期

java - 我想创建非 Web Spring Boot 应用程序

javascript - 从 ListView 中选择时如何将值传递给另一个页面

javascript - 动态添加/存储/构造 HTML 控件的推荐方法

php - Laravel <br> 到换行符

java - 如何在Spring中获取当前目录?

java - 如何在不隐藏其标签的情况下禁用 JButton?

java - 如何在 Restrictions.like 中使用 List<String> 参数

java - 如何在非托管实例中 Autowiring 类?

java - 从单个客户端向 Thrift 服务调用多个异步请求