【发布时间】:2015-07-24 03:49:35
【问题描述】:
我有一个带有以下方法的 Spring MVC 控制器:
@RequestMapping(value = "/stringtest", method = RequestMethod.GET)
public String simpletest() throws Exception {
return "test";
}
它位于一个控制器内,以这样的方式开始:
@RestController
@RequestMapping(value = "/root")
public class RootController
当我调用其他返回对象的方法时,Jackson 会将这些对象序列化为 JSON。但是这个返回字符串的方法不会转换为 JSON。如果不清楚,这里有一个使用 curl 的示例:
$curl http://localhost:8080/clapi/root/stringtest
test
所以问题是没有任何引号的“测试”不是 JSON 字符串,但我的 REST 客户端需要一个字符串。我希望 curl 命令显示带有引号的字符串,所以它是合法的 JSON:
"test"
我正在使用 Spring WebMVC 4.1.3 和 Jackson 2.4.3。我尝试在 RequestMapping 中添加一个“produces”属性来表示它应该返回 JSON。在这种情况下,返回的 Content-Type 属性是“application/json”,但仍然没有引用测试字符串。
我可以通过调用 JSON 库将 Java 字符串转换为 JSON 来解决此问题,但似乎 Spring MVC 和 Jackson 通常会自动执行此操作。然而不知何故,他们并没有在我的情况下这样做。有什么想法我可能配置错了只是测试而不是“测试”?
【问题讨论】:
-
您可以尝试将您的字符串包装在一个对象中。否则,Jackson 无法知道给字符串的 JSON 键取什么名字。
-
@Matt 一个单独的字符串是有效的 JSON,它不需要是一个对象。例如,即使是数组也可以正常工作。如果我更改代码以返回一个数组,那么我会得到
["test"]。所以我希望如果我返回一个简单的字符串,我应该得到"test" -
这不是很明显,看看这个答案:stackoverflow.com/a/7487892/369946。根据“application/json”媒体类型的RFC定义,JSON应该是一个对象或者一个数组。
-
@Matt 嗯,我同意。该页面确实提供了一些很好的相反观点。似乎 RFC 和 ECMA-404 不同意,因为 ECMA-404 没有给出这样的限制。因此,如果您遵循 RFC,那么 JSON 必须以 { 或 [ 开头,但 ECMA-404 规范并非如此。在 Javascript 中进行测试时,内置的 JSON.stringify("test")(在 Chrome 和 Safari 上测试)和 AngularJS 的 angular.toJson("test") 都会产生
"test"作为输出,因此 Javascript Web 实现和 Angular 都相信带引号的字符串是有效的 JSON。不过,如果浏览器和 RFC 相互同意就好了!
标签: json spring-mvc jackson