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

时间:2014-05-10 13:28:24

标签: java json spring 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";
    }
}

理论上,两种控制器方法都应该返回有效的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"]

但是第二个控制器方法返回的字符串没有引号,这不是有效的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

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

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

您可以删除杰克逊转换器之前注册的StringHttpMessageConverter,如评论中所述。

/**
 * 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);
}

答案 2 :(得分:0)

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

@RestController
public class TestController
{
   @RequestMapping("/getString")
   public String getString()
  {
    return JSONObject.quote("Hello World");
  }
}

答案 3 :(得分:0)

以下是我为实现这一目标所采取的措施:

  1. 在pom文件中添加依赖项:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.3</version>
    </dependency>
    
  2. 在您的方法上添加@ResponseBody注释,如下所示:

    @RequestMapping(value = "/getCountries", method = RequestMethod.GET)    
    @ResponseBody    
    public List<Country> getCountries() {    
        return countryDAO.list();    
    }