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
相关产品推荐
相关产品推荐

