有没有一种干净的方法可以在 Spring Web API 中将字符串返回为 json?

2023-12-11

例如,我必须执行如下:

@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 值必须是对象、数组、数字或字符串,或者以下之一 以下三个字面名称:

  • false
  • null
  • true

从上面可以看出,JSON 可以是比旧标准中以前更广泛的数据类型。


更新说明:另一种选择是返回 char[] 而不是 String 实例。这样,Spring Boot 将不会识别为原始 JSON 字符串:

@RequestMapping(value = "/get-string", method = {RequestMethod.GET})
public @ResponseBody char[] getString() {
    return "Hello World!".toCharArray();
}

是的,您可以使用 gson 或 jackson 等库将字符串转换为 JSON,然后为您提供如下所示的 json 输出。

Gson gson= new GsonBuilder().create();
    gson.toJson(Your String);

另外,不要忘记添加produces = MediaType.APPLICATION_JSON_VALUE暴露的方法,以便 spring 知道需要生成什么样的 o/p。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有一种干净的方法可以在 Spring Web API 中将字符串返回为 json? 的相关文章

随机推荐

  • 通过来自另一个翻译单元的指针调用具有内部链接的函数

    我们是否可以在匿名命名空间中声明一个回调函数 从而为其提供内部链接 并知道它将从另一个翻译单元 甚至另一个库 调用 一些库 void register callback void cb cb 主程序 namespace int foo cb
  • ByRef 似乎接收值而不是 VBA 6.0 中的引用

    我的小示例代码 Function AddNr ByRef x As Integer As Integer x x 2 AddNr x End Function Sub test Dim ana As Integer ana 1 AddNr
  • java 8 日期时间解析错误

    我正在尝试将字符串转换为LocalDate目的 但我收到以下错误 private LocalDate getLocalDate String year String yearFormatted 2015 01 11 DateTimeForm
  • 在后台运行的 ssh 进程被暂停

    我有一些正在虚拟机上开发的脚本 但有时需要在生产服务器上运行才能进行正确测试 我需要脚本的输出进行调试 因此我修补了以下解决方案 function test remote scp 1 Prod home xxx tmp n 1 t r f
  • 循环字符串,向字符串添加单词,返回字符串

    我有一个纯文本对象 我还有一系列对象 在该对象数组中 每个对象都包含偏移量和长度键 我想循环遍历我的纯文本字符串 将正确的单词插入到字符串中的某些偏移处 然后返回该字符串 下面是我的代码 const plainText Hey name y
  • 理解c中#defines的不同风格

    我正在查看 C 编程语言的不同源代码 发现使用了不同风格的 define 从技术上讲 我知道它们的用例 并且无论它们的风格如何 它们都会按预期工作 但从编码指南来看 我想问它们是什么意思以及何时使用特定的用例 define MY DEFIN
  • postgres 使用什么哈希算法/函数进行 PARTITION BY HASH

    在postgres中 有一个基于的分区hash But postgres没有清楚地解释如何计算给定列值的哈希值 我搜索了 Postgres 文档 但一无所获 除了一些邮箱帖子里 还有人提到hashtext 内部功能 有谁有关于用于散列值的实
  • ggplot:如何使用facet_grid创建不同的x轴标题

    我有两个共享 y 轴但具有不同 x 轴的图 我使用facet grid将它们适当地分开 见图 但是两个x轴需要有不同的标题 而不是一个标题 Num Cell Lines Tissue 我见过类似的方法 首先创建 2 个 ggplot 对象
  • 使用html5和php上传多个文件

    我有一个使用 HTML5 多重属性设置的文件上传表单 但是 该表单仍然只上传单个文件 我是否需要在 php 中创建某种循环函数 或者是否有其他方法可以做到这一点 这是我的代码 form
  • 为什么相同的日期有不同的时间?

    也许答案很明显 但我不明白 为什么代码片段中的日期不同 该格式是否也说明了有关时间的信息 console log 2017 1 9 gt console log new Date 2017 1 9 console log 2017 1 09
  • 如何获取加载的样式表的内容

    我想从页面头部链接的 css 文件中获取样式表规则 或 css textContent document styleSheets似乎适用于所有主流浏览器 但是styleSheets 0 cssRules当然在 IE 对于 IE 你可以使用r
  • 列表从索引中切片[重复]

    这个问题在这里已经有答案了 gt gt gt a a b c d e f g h l gt gt gt a 30 gt gt gt a 30 a b c d e f g h l 我试图理解这种切片背后的逻辑 例如 当我们尝试通过索引访问元素
  • Python中根据多个条件返回列的方法

    我有一个数据框如下 基于一些条件 我需要检索该列 Wifi User1 Wifi User2 Wifi User3 Thermostat Act User1 Act User2 Act User3 58 48 60 18 0 1 0 60
  • Webkit 和 Excel 文件(PHPexcel)

    我有一个可以下载的 excel 文件 例如 NAME xlsx 很好 它在 firefox 中工作 但在 webkit safari chrome 中它也附加到名称扩展名 xhtml那么它的名称将是 NAME xlsx html 它应该是仅
  • 如何创建数字选择器对话框?

    我希望能够创建一个对话框 允许用户从指定范围中选择一个数字 我知道现有的小部件 例如来自 Quietlycoding 的小部件和 SimonVT 的小部件 已经做到了这一点 但我很难将它们正确地集成到我的应用程序中 此外 这些主要是小部件
  • MySQL - 当嵌套选择使用该表时如何从表中删除?

    我正在尝试做这样的事情 DELETE FROM table 1 WHERE table 1 id IN SELECT table 1 id FROM table 1 table 2 table 3 WHERE table 1 id tabl
  • 像 xcode 一样批量优化 iphone/ipad 显示的 PNG

    我正在为 ipad 开发杂志查看器 但我在性能方面遇到了困难 我发现显示 png 最昂贵的部分是加载过程 我知道 xcode 能够在构建过程中优化 png 并且此类图像的加载速度要快得多 但我无法将所有图像都包含到构建中 因为它会很大 您知
  • Angular2 路由器中的生命周期挂钩

    在 angular2 路由器中添加生命周期挂钩时遇到问题 如果任何人都可以分享在 Angular2 路由器中添加生命周期挂钩的代码 那将会很有帮助 我了解了如何添加 可以激活 挂钩 感谢埃里克的帮助 与其他生命周期挂钩不同 CanActiv
  • WCF REST 错误 HTTP 307

    我有一个 REST WCF 服务 当尝试对此服务执行如下操作的 POST 时 我收到以下错误 OperationContract WebInvoke Method POST UriTemplate RequestFormat WebMess
  • 有没有一种干净的方法可以在 Spring Web API 中将字符串返回为 json?

    例如 我必须执行如下 RequestMapping value get string method RequestMethod GET public ResponseBody String getString return Hello Wo