弹簧控制器中的简单字符串作为JSON返回值

kay*_*ahr 11 java spring json spring-mvc jackson

让我们看看下面的简单测试控制器(与Spring 4.0.3一起使用):

@RestController
public class TestController
{
    @RequestMapping("/getList")
    public List<String> getList()
    {
        final List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        return list;
    }

    @RequestMapping("/getString")
    public String getString()
    {
        return "Hello World";
    }
}
Run Code Online (Sandbox Code Playgroud)

理论上,两种控制器方法都应该返回有效的JSON.调用第一个控制器方法确实会返回以下JSON数组:

$ curl -i -H "Accept: application/json" http://localhost:8080/getList
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

["1","2"]
Run Code Online (Sandbox Code Playgroud)

但第二个控制器方法返回没有引号的字符串,这不是有效的JSON字符串:

$ curl -i -H "Accept: application/json" http://localhost:8080/getString
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

Hello World
Run Code Online (Sandbox Code Playgroud)

为什么会这样?可以配置吗?这是一个错误吗?或者我不明白的功能?

chr*_*ke- 8

当您返回一个String对象时,Spring MVC会将其解释为放入响应主体的内容,而不会进一步修改它.如果您想要一个实际的字符串作为JSON响应,您需要自己引用它或明确地通过Jackson运行它.

  • @kayahr但是如果你想在没有Jackson的情况下生成自己的JSON字符串(可能是一个非常简单的字符串连接)怎么办?那么Spring必须重新解析你的回复才能检查你.`ResponseBody`表示`ResponseBody`,它最终是一个字节序列,如果Spring无法匹配有问题的Java类型,它只会执行转换; `String`不需要转换. (3认同)

d0x*_*d0x 5

您可以删除在StringHttpMessageConverterjackson 转换器之前注册的 , - 就像评论中提到的那样。

/**
 * Unregister the default {@link StringHttpMessageConverter} as we want
 * Strings to be handled by the JSON converter.
 *
 * Our MappingJackson2HttpMessageConverter will deal with strings.
 *
 * @param converters
 *            List of already configured converters
 */
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.removeIf(converter -> converter instanceof StringHttpMessageConverter);
}
Run Code Online (Sandbox Code Playgroud)