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

如何将Excel下载API返回的响应转换为JSON格式及解决InputStreamResponse读取文件损坏问题

解决API响应转JSON及Excel响应转JSON的实操步骤

嘿,我来帮你梳理下这两个问题的解决思路,都是开发里常用的落地方案:

一、把普通API响应转成JSON读取数值(解决InputStreamResponse损坏问题)

之前用InputStreamResponse频繁出现文件损坏,大概率是流操作时没处理好编码、没读完流或者分块传输的问题,转成字符串再处理会避开这些坑,步骤如下:

  • 第一步:完整读取响应内容为字符串
    改用字符流读取,指定正确的编码(一般是UTF-8),确保把响应内容完整读出来,避免流操作的损坏问题。比如Java里的代码示例:

    // 用try-with-resources自动关闭流,避免资源泄漏
    try (InputStream is = response.getInputStream();
         BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
        String responseBody = reader.lines().collect(Collectors.joining("\n"));
        // 接下来处理这个字符串
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  • 第二步:将字符串解析为JSON对象
    用常用的JSON库(比如Jackson、Gson、org.json)把字符串转成可操作的JSON结构,之后就能轻松读取里面的数值了。比如用Jackson的示例:

    ObjectMapper objectMapper = new ObjectMapper();
    try {
        JsonNode jsonNode = objectMapper.readTree(responseBody);
        // 读取具体字段,比如获取名为"id"的数值
        int id = jsonNode.get("id").asInt();
        String name = jsonNode.get("name").asText();
    } catch (JsonProcessingException e) {
        // 处理JSON解析失败的情况,比如响应不是合法JSON
        e.printStackTrace();
    }
    
  • 额外排查:如果API返回的是二进制流
    如果你的API本来返回的是二进制数据(比如文件)但你想转JSON,那得先确认这个二进制数据是否是序列化后的JSON(比如字节形式的JSON),这时候转成字符串再解析就行;如果是其他二进制格式,那得先转成结构化数据再转JSON。

二、将Excel下载API的响应转成JSON

Excel下载API返回的是二进制的Excel文件(.xlsx/.xls),不能直接转JSON,得先解析Excel内容再转,步骤如下:

  • 第一步:读取Excel的二进制流
    直接读取响应的输入流为字节数组或者保留流对象,不要转成字符串(会乱码损坏)。比如用Apache Commons IO简化操作:

    try (InputStream is = response.getInputStream()) {
        byte[] excelBytes = IOUtils.toByteArray(is);
        // 用字节数组处理Excel
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  • 第二步:解析Excel内容为Java对象
    用Excel解析库(推荐EasyExcel,比Apache POI更高效;或者Apache POI)读取Excel里的数据,映射到自定义的实体类。比如EasyExcel的示例:

    // 先定义和Excel列对应的实体类
    public class ExcelData {
        @ExcelProperty("用户ID")
        private Integer userId;
        @ExcelProperty("用户名")
        private String userName;
        // getter、setter省略
    }
    
    // 解析Excel
    try (ByteArrayInputStream bais = new ByteArrayInputStream(excelBytes)) {
        List<ExcelData> dataList = EasyExcel.read(bais)
                                        .head(ExcelData.class)
                                        .sheet() // 读取第一个sheet
                                        .doReadSync();
        // 现在dataList就是Excel里的结构化数据
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  • 第三步:将Java对象转成JSON
    还是用JSON库把解析后的对象列表转成JSON字符串,或者直接操作对象取数值:

    String jsonStr = objectMapper.writeValueAsString(dataList);
    // 输出的jsonStr就是Excel内容对应的JSON格式
    

一些注意事项

  • 所有流操作都要用try-with-resources语法,自动关闭流,避免资源泄漏和未读完流的问题。
  • 如果API返回的是压缩响应(比如gzip),要先解压流再处理,不然读取的内容会损坏。
  • 解析JSON或Excel时,要做好异常处理(比如响应格式不符合预期的情况),避免程序崩溃。

内容的提问来源于stack exchange,提问作者QA Eyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:42:35