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

Wil*_*ler 8 java spring json jackson

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

{"optionDtoList":[{...}, ..., {...}]}
Run Code Online (Sandbox Code Playgroud)

当我真正想要的是这个:

[{...}, ..., {...}]
Run Code Online (Sandbox Code Playgroud)

我正在直接序列化Java List; 我没有用包装器对象包装List并序列化包装器对象.杰克逊似乎正在添加JavaScript包装器对象.

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

对解决方案的限制

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

我试过的

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

Bij*_*men 5

在我运行的测试模式中:

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);
Run Code Online (Sandbox Code Playgroud)

收益:

["one","two","three","four","five"]
Run Code Online (Sandbox Code Playgroud)

这是你期待的行为吗?

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

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


小智 5

我遇到了和你一样的问题.

在方法声明中将@ResponseBody添加到我的列表前面后,问题就解决了.

例如:

public @ResponseBody List<MyObject> getObject