添加 GZIP 编码导致 MalformedJsonException

Posted

技术标签:

【中文标题】添加 GZIP 编码导致 MalformedJsonException【英文标题】:Adding GZIP encoding results in MalformedJsonException 【发布时间】:2015-05-17 21:11:01 【问题描述】:

我在基本请求中添加了这个标头:“Accept-encoding”、“gzip”

这会导致 MalformedJsonException 敦促我使用 JsonReader.setLenient(true)

我已经修改了我的代码来支持它:

JsonReader jsonReader = new JsonReader(new StringReader(myStringReader with json string));
jsonReader.setLenient(true);
JsonParser parser = new JsonParser();
JsonObject object = parser.parse(jsonReader).getAsJsonObject();

我仍然遇到同样的错误,有人认为吗?

【问题讨论】:

您可以使用java.util.zip.GZIPInputStream解压缩gzip字符串 【参考方案1】:

几件事-

    如果您正在设置 GZIP 标头,这会告诉您正在联系的服务器您能够解压缩 gzip 的响应。您可能正在取回压缩后的响应,并尝试将其解析为 json - 您需要先对其进行解压缩。

    如果您使用HttpUrlConnection,它会自动设置gzip 标头为您解压缩。您可以通过代理您的应用程序并查看它发出的 http 请求来确认这一点。

    HttpUrlConnection 的一个有趣之处在于,虽然它会设置 gzip 标头并为您解压缩,如果您自己设置 gzip 标头,它不会。然后它会依赖你来解压它。

简而言之,要么根本不设置标头,而是依靠HttpUrlConnection 为您完成所有工作,或者您必须在 json 代码之前使用 GZIPInputStream 类解压缩响应,请参阅此答案深入解释:

How can I Zip and Unzip a string using GZIPOutputStream that is compatible with .Net?

【讨论】:

以上是关于添加 GZIP 编码导致 MalformedJsonException的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 4 - 使用 gzip 编码上传多部分

使用Rack :: Deflator添加GZIP会导致Heroku上的“客户端请求中断”错误

HttpURLConnection 不解压缩 Gzip

jmeter ---模拟http请求/发送gzip数据

HTTP:“gzip,deflate”的首选接受编码是啥?

Flutter Gzip 编码与解码 Dart Gzip 工具类操作