我有一个以 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/