You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何去除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:47:17