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

Android读取Trivia API的JSON文件异常,IOUtils未读完整内容

解决Async读取Trivia API JSON时的不完整读取问题

我之前在处理API流读取时也碰到过类似的截断问题,结合你描述的场景,给你几个实际可行的排查和修复方向:

1. 修正IOUtils的使用姿势

输入流读取不全大概率和流的关闭逻辑、编码处理有关。试试用带编码参数的重载方法,同时用try-with-resources语法确保流自动关闭:

try (InputStream inputStream = new URL(apiUrl).openStream()) {
    // 指定UTF-8编码避免隐性编码问题,同时自动关闭流
    String fullJson = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
    // 后续解析JSON逻辑
} catch (IOException e) {
    // 打印完整堆栈日志,方便定位具体异常点
    e.printStackTrace();
}

之前我就是因为没指定编码,导致部分特殊字符截断,改成带编码的方法后就解决了。

2. 先验证API返回的JSON本身是否完整

有时候问题不在代码,而是API返回的响应本身就有截断或者格式错误。你可以手动调用这个Trivia API的URL,把返回的JSON复制出来:

  • 检查是否存在第11个问题之后的内容
  • 用JSON校验工具(本地可以用org.json的JSONTokener)验证格式是否在第11个问题位置有语法错误(比如缺逗号、括号不匹配)

如果API返回的JSON本身就不完整,那解析到一半自然会中断。

3. 跳过手动读流,直接用JSON库解析

如果IOUtils还是不靠谱,试试用Jackson/Gson这类专业JSON库直接从流解析成对象,跳过手动转字符串的步骤:
比如用Jackson的示例:

ObjectMapper mapper = new ObjectMapper();
try (InputStream inputStream = new URL(apiUrl).openStream()) {
    // 直接把流解析成你的问题列表对象
    TriviaApiResponse response = mapper.readValue(inputStream, TriviaApiResponse.class);
    // 遍历response里的问题集合即可
} catch (IOException e) {
    e.printStackTrace();
}

这种方式由JSON库负责流的完整读取,能避免很多手动处理流的坑。

4. 检查Async任务的执行限制

会不会是你的Async线程被提前终止了?比如线程池的超时时间设置太短,导致流还没读完就被中断。可以检查Async任务的配置:

  • 线程池的keepAliveTime参数
  • 任务的超时时间设置

另外可以在读取过程中加日志,比如打印当前读取的字符串长度,看看是不是到第11个问题时刚好触发了某个限制。


内容的提问来源于stack exchange,提问作者Alex Kennedy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:48:53