如何去除API返回数组中的多余双引号与转义字符
问题成因分析
你的问题核心是Java代码把Shell脚本输出的JSON字符串当成普通字符串处理,未解析为Java对象,导致序列化时对原JSON的引号再次转义。比如Shell输出的["us-east-1","us-west-2"]被Java存为字符串字段,返回时会被序列化为"[\"us-east-1\",\"us-west-2\"]",从而出现多余的转义和引号。
解决步骤
1. 确保Shell脚本输出纯净的JSON数组
先让Shell脚本输出标准的JSON数组,用AWS CLI的--query和--output参数直接生成目标格式:
#!/bin/bash aws ec2 describe-regions --query "Regions[].RegionName" --output json
该命令会直接输出["us-east-1","us-west-2",...]这类纯净JSON数组,无多余字符。
2. Java端解析Shell输出为Java集合
不要将Shell输出的字符串直接塞进响应对象,而是用JSON库(比如Gson)将其解析为List<String>,再封装到响应对象中。
3. 正确返回ResponseEntity
确保返回的是包含Java集合的响应对象,而非包含JSON字符串的对象,这样Spring的消息转换器会正确将集合序列化为JSON数组。
Gson实现示例代码
第一步:添加Gson依赖(Maven)
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> <!-- 使用最新稳定版 --> </dependency>
第二步:Java代码实现
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.io.BufferedReader; import java.io.InputStreamReader; import java.lang.reflect.Type; import java.util.List; @RestController public class AwsRegionController { private final Gson gson = new Gson(); @GetMapping("/aws/regions") public ResponseEntity<AwsRegionList> getAwsRegions() throws Exception { // 调用Shell脚本 Process process = new ProcessBuilder("./get-regions.sh").start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); StringBuilder output = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { output.append(line); } process.waitFor(); // 用Gson解析JSON数组为List<String> Type regionListType = new TypeToken<List<String>>(){}.getType(); List<String> regions = gson.fromJson(output.toString(), regionListType); // 封装到响应对象 AwsRegionList response = new AwsRegionList(); response.setRegions(regions); return ResponseEntity.ok(response); } // 响应对象类 static class AwsRegionList { private List<String> regions; // Getter和Setter public List<String> getRegions() { return regions; } public void setRegions(List<String> regions) { this.regions = regions; } } }
第三步:验证返回结果
此时Swagger中返回的响应格式应为:
{ "regions": [ "us-east-1", "us-west-2", "eu-west-1" ] }
无多余转义引号,符合预期。
额外注意事项
- 给Shell脚本添加可执行权限:
chmod +x get-regions.sh - 处理Shell脚本的错误输出,避免异常导致解析失败
- 若Spring Boot默认使用Jackson序列化,也可改用Jackson解析JSON数组,Gson只是可选方案之一
内容的提问来源于stack exchange,提问作者user2315104
相关产品推荐
相关产品推荐

