【发布时间】:2017-11-03 04:54:42
【问题描述】:
例如,我必须实现如下:
@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 和three 这些问题重复。正确的answer 表示问题出在 Spring Boot 的默认序列化程序(Jackson 的库),它将字符串值(序列化时)视为原始 JSON 字符串,因此它返回的值没有双引号而不是添加,正如我所期待的.
公平地说,我会选择 Bhargav 的answer,它更接近我所寻找的。 ddbullfrog 和 RohaNayak 的答案是正确的,但它们并不能正确解决我的问题。 Ademir Constantino 的 comment 也是正确的,他说使用纯文本而不是 json 格式,使用这个 reference。 Luay Absulraheem 的answer 是配置操作的正确方法,但它不能按预期方式工作,它继续将字符串作为原始 json 发送。 非常感谢您的回答!
此外,可以自定义 Spring Boot 以使用 Gson 作为其序列化程序,如article 所示。在您的项目上安装 Gson 依赖项后,您只需在 application.properties 文件中添加这一行:
...
spring.http.converters.preferred-json-mapper=gson
这样就不用每次要发送字符串值时都要解析 由 Spring Boot 序列化,并且在 AJAX 处理程序上没有双引号时不会接收它。
我试图在 ASP.NET MVC 上实现相同的行为,它使用 JSON.NET library 来执行序列化。这一点以及 AJAX 接受单个字符串(例如“hello world”)作为 JSON 的事实,让我对 JSON 模式进行了更深入的研究。
JSON 格式有多个“标准”定义。正如在此 Stack 的其他 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();
}
【问题讨论】:
标签: java json spring string serialization