用例:从Spring Rest Controller返回一个JSON字符串列表(JSON字符串来自第三方库)。
:来自REST控制器的响应具有转义字符。只有当返回类型是List或array或任何其他集合类型时,才会发生这种情况。返回一个字符串就可以了。
如何返回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}
}
}
Springboot version: 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}
}
}
基本上,Spring MVC (Spring 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为我转换任何东西,我自己来做。在这种情况下,你应该明白为什么你的第三方返回这样的字符串,你可以用它做什么
我知道有点晚了,但我希望这会对别人有所帮助我也有类似的问题
在我的响应DTO对象中有一个字段叫做String additionalLanguages
基本上,它是一个表示为String的JSON对象。通常,当我返回响应时,我会得到这样的东西,一个带有转义字符的字符串,例如:"additionalLanguages"[{"abbr"ar","title":"الأماكن"}]",为了解决这个问题,我只需要添加一个注释
@JsonRawValue
现在的响应看起来像这样
"additionalLanguages": [
{
"abbr": "ar",
"title": "الأماكن"
}
],
您可以尝试这样来避免转义。
@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();
}
Upvote,
value1.concat(value2);
以上代码将两个字符串连接起来,因此在结果字符串中不会产生转义字符。
String value1 = "{"name":"John", "age":30}";
String value2 = "{"name":"Tom", "age":21}";
return Arrays.asList(value1, value2);
在上面的代码中,您正在向列表中添加一个String。所以你会看到转义字符,例如"。
如果你想要一个对象列表,使用对象映射器或GSON库将String转换为Object,并将这些对象添加到列表中。
您正在向列表添加JSON(这是字符串)。所以你得到了一个带有转义字符的字符串
还有另一种方法。创建一个JSON对象,并将response1和response2添加到该对象,并返回该对象。