java 如何避免在返回JSON字符串列表的Spring REST控制器响应中使用转义字符?

goucqfw6  于 2022-12-28  发布在  Java
关注(0)|答案(4)|浏览(188)
    • 使用案例**:从Spring Rest Controller返回JSON字符串列表(JSON字符串来自第三方库)。
    • 问题**:来自REST控制器的响应包含转义字符。仅当返回类型为列表、数组或任何其他集合类型时才会发生这种情况。返回单个字符串可以正常工作。

如何返回JSON格式的字符串列表,但避免转义字符。

    • 代码**:
import java.util.Arrays;
import java.util.List;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("restjson")
public class RestJsonController {

    @GetMapping(value="list", produces = {MediaType.APPLICATION_JSON_VALUE})
    public List<String> getValues(){
        String value1 = "{\"name\":\"John\", \"age\":30}";
        String value2 = "{\"name\":\"Tom\", \"age\":21}";
        
        return Arrays.asList(value1, value2);
        //response has escape characters: 
        //["{\"name\":\"John\", \"age\":30}","{\"name\":\"Tom\", \"age\":21}"]
    }

    @GetMapping(value="single", produces = {MediaType.APPLICATION_JSON_VALUE})
    public String getValue(){
        String value1 = "{\"name\":\"John\", \"age\":30}";
        String value2 = "{\"name\":\"Tom\", \"age\":21}";
        
        return value1.concat(value2);
        //response has no escape characters: 
        //{"name":"John", "age":30}{"name":"Tom", "age":21}
    }
}

Spring Boot版本:2.7.0
完整代码位于:https://github.com/rai-sandeep/restjson/blob/main/src/main/java/com/sdprai/restjson/controller/RestJsonController.java

    • 编辑**:

为了避免任何与字符串连接相关的混淆,我更新了代码(见下文)。返回一个列表,即使只有一个JSON字符串,也会导致响应中出现转义字符。但只返回一个字符串就不会有这个问题。我不明白这种差异背后的原因。对于我的用例,有没有办法返回一个没有转义字符的JSON字符串列表?

import java.util.Collections;
import java.util.List;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("restjson")
public class RestJsonController {

    @GetMapping(value="list", produces = {MediaType.APPLICATION_JSON_VALUE})
    public List<String> getValues(){
        String value1 = "{\"name\":\"John\", \"age\":30}";
        
        return Collections.singletonList(value1);
        //returns: ["{\"name\":\"John\", \"age\":30}"]
    }

    @GetMapping(value="single", produces = {MediaType.APPLICATION_JSON_VALUE})
    public String getValue(){
        String value1 = "{\"name\":\"John\", \"age\":30}";
        
        return value1;
        //returns: {"name":"John", "age":30}
    }
}
af7jpaap

af7jpaap1#

基本上,SpringMVC( Boot 的一部分,负责处理Rest控制器和其他事情)通过将常规java对象转换为有效的json字符串(没有反斜杠)来处理JSON响应。
所以问题是为什么你需要使用字符串呢?试试下面的代码:

public class Person {
   private String name;
   private int age;
   // constructors, getters, etc.
}

 @GetMapping(value="list", produces = {MediaType.APPLICATION_JSON_VALUE})
    public List<Peron> getValues(){
        Person value1 = new Person("John", 30);
        Person value2 = new Person("Tom", 21);
        
        return Arrays.asList(value1, value2);

    }

现在,如果你说像{\"name\":\"John\", \"age\":30}这样的字符串已经从某个第三方提供给你了,你“被迫”返回一个List<String>而不是List<Person>,这就像是说-我不想让spring为我转换任何东西,我会自己做。

kiayqfof

kiayqfof2#

你可以试试这个来避免逃跑。

@GetMapping(value="list", produces = {MediaType.APPLICATION_JSON_VALUE})
    public String getValues(){
        String value1 = "{\"name\":\"John\", \"age\":30}";
        String value2 = "{\"name\":\"Tom\", \"age\":21}";
        return Arrays.asList(value1, value2).toString();
    }

赞成票和接受,如果这工作。

qhhrdooz

qhhrdooz3#

value1.concat(value2);

以上代码连接两个字符串,因此在结果字符串中不会产生转义字符。

String value1 = "{\"name\":\"John\", \"age\":30}";
        String value2 = "{\"name\":\"Tom\", \"age\":21}";
        
        return Arrays.asList(value1, value2);

在上面的代码中,你添加了一个字符串到列表中,所以你看到了转义字符,例如"for"。
如果您想要一个对象列表,使用对象Map器或GSON库将String转换为Object,并将这些对象添加到列表中。

    • 更新**

您要将JSON(字符串)添加到列表中,因此您得到了一个带有转义符的字符串。
还有另一种方法可以做到这一点。创建一个JSON对象,并向该对象添加response1和response2,然后返回该对象。

yduiuuwa

yduiuuwa4#

我知道有点晚了,但我希望这对其他人有帮助我也有类似的问题
在我的响应DTO对象中有一个名为String additionalLanguages的字段基本上,它是一个JSON对象,表示为String。通常,当我返回响应时,我会得到这样的内容,一个带有转义字符的字符串,例如:“附加语言”:“[{“abbr”:“ar”,“title”:“照照照照照照照照照照照"}]",为了修复这个问题,我只需要添加一个注解

@JsonRawValue

现在响应看起来像这样

"additionalLanguages": [
        {
            "abbr": "ar",
            "title": "الأماكن"
        }
    ],

相关问题