例如,我必须执行如下:
@RequestMapping(value = "/get-string", method = {RequestMethod.GET})
public @ResponseBody String getString() {
return "Hello World!";
}
当 Ajax 在 JS 文件中调用该操作时,收到的响应是:HelloWorld
。因此,如果 Ajax 请求配置为仅接收 json 编码响应,我会收到标准解码错误。为了在服务器端解决这个问题,我需要接收"HelloWorld"
.
我的问题是:有一种干净的方法可以做到这一点,而不是仅仅更改下面字符串返回的字符串?
...
return "\"Hello World!\"";
}
更新说明:在提出这个问题时,我对返回 JSON 映射而不是单个字符串的解决方案感到满意,正如我之前想要的那样。
但现在,我花了一些时间搜索这个问题,并尝试了解更多有关 JSON 模式的信息。
首先,我发现我的问题与这些问题重复one, two and three。正确的answer说问题在于 Spring Boot 的默认序列化器(Jackson 的库)将字符串值(序列化时)视为原始 JSON 字符串,因此它返回不带双引号的值,而不是像我预期的那样添加值。
公平地说,我会选巴尔加夫的answer,这更接近我正在寻找的东西。答案来自牛蛙 and 罗哈纳亚克是正确的,但他们没有正确解决我的问题。阿德米尔·康斯坦丁的comment也是正确的,他说使用纯文本/文本而不是 json 格式,使用这个参考。卢艾·阿卜苏拉希姆 (Luay Absulraheem)answer是配置操作的正确方法,但它没有按想要的方式工作,它继续将字符串作为原始 json 发送。非常感谢您的回答!
此外,可以自定义 Spring Boot 以使用 Gson 作为其序列化器,如下所示article。在您的项目中安装 Gson 依赖项后,您只需将这一行添加到您的项目中应用程序属性 file:
...
spring.http.converters.preferred-json-mapper=gson
这样,就不必每次要发送字符串值时都进行解析
由 Spring Boot 序列化,并且在 AJAX 处理程序上不带双引号就不会接收它。
我试图实现与 ASP.NET MVC 相同的行为,它使用 JSON.NETlibrary执行序列化。这一事实以及 AJAX 接受单个字符串(例如“hello world”)作为 JSON 的事实,使我对 JSON 模式进行了更深入的研究。
JSON 格式有不止一种“标准”定义。正如该堆栈的其他讨论中所讨论的那样question,JSON 值中的当前“互联网标准”定义为RFC-8259正如该文件第 5 页所述:
JSON 值必须是对象、数组、数字或字符串,或者以下之一
以下三个字面名称:
从上面可以看出,JSON 可以是比旧标准中以前更广泛的数据类型。
更新说明:另一种选择是返回 char[] 而不是 String
实例。这样,Spring Boot 将不会识别为原始 JSON 字符串:
@RequestMapping(value = "/get-string", method = {RequestMethod.GET})
public @ResponseBody char[] getString() {
return "Hello World!".toCharArray();
}