Java 在SpringWebAPI中有一种干净的方法可以将字符串作为json返回?

Java 在SpringWebAPI中有一种干净的方法可以将字符串作为json返回?,java,json,spring,string,serialization,Java,Json,Spring,String,Serialization,例如,我必须执行以下操作: @RequestMapping(value=“/get string”,method={RequestMethod.get}) public@ResponseBody字符串getString(){ 返回“你好,世界!”; } 当Ajax在JS文件中调用该操作时,收到的响应是:HelloWorld。因此,如果Ajax请求被配置为只接收json编码的响应,那么我将收到标准的解编码错误。为了在服务器端解决这个问题,我需要接收“HelloWorld” 我的问题是:有一种干净

例如,我必须执行以下操作:

@RequestMapping(value=“/get string”,method={RequestMethod.get})
public@ResponseBody字符串getString(){
返回“你好,世界!”;
}
当Ajax在JS文件中调用该操作时,收到的响应是:
HelloWorld
。因此,如果Ajax请求被配置为只接收json编码的响应,那么我将收到标准的解编码错误。为了在服务器端解决这个问题,我需要接收
“HelloWorld”

我的问题是:有一种干净的方法可以做到这一点,而不是仅仅更改为下面的字符串返回的字符串

。。。
返回“\”你好,世界\"";
}
更新说明:在回答这个问题时,我对返回JSON映射而不是像我之前所希望的那样返回单个字符串的解决方案感到满意

但是现在,我花了一些时间来搜索这个,并试图了解更多关于JSON模式的信息

首先,我发现我的问题与这些问题重复,并且。正确的说法是,问题在于Spring Boot的默认序列化程序(Jackson的库)将字符串值(序列化时)视为原始JSON字符串,因此它返回的值不带双引号,而不是像我所期望的那样添加

平心而论,我会选择更接近我所寻找的巴尔加夫。和的答案是正确的,但它们不能正确地解决我的问题。阿德米尔·康斯坦丁诺(Ademir Constantino)的观点也是正确的,他说使用纯文本而不是json格式,使用这种格式。Luay Absullaheem是配置操作的正确方法,但它并没有按照所需的方式工作,而是继续以原始json的形式发送字符串非常感谢您的回答

此外,还可以自定义Spring引导以使用Gson作为其序列化程序,如本文所示。在项目上安装Gson dependency后,只需在application.properties文件中添加以下行:

这样,您就不必每次发送字符串值时都进行解析 要通过SpringBoot进行序列化,并且在AJAX处理程序上没有双引号时不会收到它


我试图实现与ASP.NET MVC相同的行为,它使用JSON.NET执行序列化。这一点以及AJAX接受单个字符串(例如“hello world”)作为JSON的事实,使我对JSON模式进行了更深入的研究

JSON格式有不止一个“标准”定义。正如在该堆栈的另一个堆栈中所讨论的,JSON值的当前“互联网标准”由定义,如文档第5页所述:

JSON值必须是对象、数组、数字或字符串,或者 以下三个文字名称:

  • 假的
  • 空的
  • 真的
如上所述,JSON可以是比以前旧标准中更广泛的数据类型


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

@RequestMapping(value=“/get string”,method={RequestMethod.get})
public@ResponseBody char[]getString(){
返回“你好,世界!”.toCharArray();
}

您可以向客户端返回json格式的字符串值


返回“{\“response\”:\“Hello World!\”}”

尝试将
products={MediaType.APPLICATION\u JSON\u VALUE}
添加到
@RequestMapping
中,因为它会影响实际写入的内容类型。要使用UTF-8编码生成JSON响应,应使用
products={MediaType.APPLICATION\u JSON\u UTF8\u VALUE}

是的,您可以使用诸如gson或jackson之类的库将字符串转换为JSON,方法是提供一个JSON输出,如下所示

Gson gson= new GsonBuilder().create();
    gson.toJson(Your String);
另外,别忘了添加
products=MediaType.APPLICATION\u JSON\u VALUE
到公开的方法,以便spring知道需要生成什么类型的o/p。

只需创建一个带有键值的映射。这将达到目的。 每个JSON都需要一个键和一个值 map.put(“hello”:“您的字符串值”)

返回图

解决方案 Spring中默认配置了一个
StringHttpMessageConverter
,它处理从控制器返回的任何
字符串
,而不考虑媒体类型,就像它是
text/plain
一样

您可以通过在Spring中配置的所有其他消息转换器之后移动
StringHttpMessageConverter
来解决这个问题,或者用您自己的不处理
*/*
媒体类型的实现来替换它并对其进行配置

在Spring boot中: 扩展
WebMVCConfigureAdapter
,覆盖
extendMessageConverters
,并根据需要修改接收到的列表,例如

@Configuration
public class StringHttpMessageConverterReorganizingWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter
{
    @Override
    public void extendMessageConverters(final List<HttpMessageConverter<?>> converters)
    {
        super.extendMessageConverters(converters);

        // do whatever you see fit with StringHttpMessageConverter in the converters list
        // ...
    }
}
@配置
公共类StringHttpMessageConverterReOrganizationWebMVCConfigureAdapter扩展了WebMVCConfigureAdapter
{
@凌驾

public void extendMessageConverters(最终列表)这是一种方式……但我只想返回
“Hello World!”
。正如JSON规范所说(),“字符串是零个或多个Unicode字符的序列,用双引号括起来,使用反斜杠转义。”可以是JSON。构成JSON的两个主要部分是键和值。它们一起构成一个键/值对。键:键总是一个用引号括起来的字符串。值:值可以是字符串、数字、布尔表达式、数组或对象。因此,我认为没有键,它只是一个字符串,而不是JSON。我相信您无法返回响应eBody对象。选中此选项,它可以通过返回纯文本字符串来解决问题。如问题所述,所需的行为是序列化控制器操作返回的字符串。此解决方案在返回字符串之前执行序列化时有效。这是必需的
@Configuration
public class StringHttpMessageConverterReorganizingWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter
{
    @Override
    public void extendMessageConverters(final List<HttpMessageConverter<?>> converters)
    {
        super.extendMessageConverters(converters);

        // do whatever you see fit with StringHttpMessageConverter in the converters list
        // ...
    }
}