InputStream转换为JSONElement时抛出异常,如何解决?
问题分析与解决方案
错误根源
你看到的\u001f?\b\u000\u000\u0004\u0003uT是GZIP压缩数据流的头部标识,输入流是经过GZIP压缩的,不是明文JSON,直接用InputStreamReader读取解析自然会失败,和编码设置无关。
修正后的代码
先通过GZIPInputStream解压缩输入流,再进行JSON解析:
import com.google.gson.JsonElement; import com.google.gson.JsonParser; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.zip.GZIPInputStream; public JsonElement parseJsonContentFromStream(InputStream in) throws Exception { // 先解压缩输入流,再读取解析 try (GZIPInputStream gzipIn = new GZIPInputStream(in); InputStreamReader isr = new InputStreamReader(gzipIn, StandardCharsets.UTF_8); BufferedReader bufferedReader = new BufferedReader(isr)) { JsonParser parser = new JsonParser(); return parser.parse(bufferedReader); } }
补充说明
- 代码使用try-with-resources语法自动关闭流,避免资源泄漏
- 若输入流是其他压缩格式(如Deflate),需替换为对应解压流
- 可通过检测流的前两个字节(GZIP魔数为
0x1F8B),动态判断是否需要解压
内容的提问来源于stack exchange,提问作者Reach Loki
相关产品推荐
相关产品推荐

