Java从json属性解压缩HTTP GZIP内容

问题描述 投票:0回答:2

我们正在使用packetbeat,一个网络数据包分析工具来捕获http请求和http响应。 Packebeat以json格式保存此数据包事件。当服务器支持gzip压缩时,问题就出现了,packetbeat无法解压缩内容并将gzip内容直接保存为json属性。如你所见(注:json已经简化);

{
 {
     ... ,
     "content-type":"application/json;charset=UTF-8",
     "transfer-encoding":"chunked",
     "content-length":6347,
     "x-application-context":"proxy-service:pre,native:8080",
     "content-encoding":"gzip",
     "connection":"keep-alive",
     "date":"Mon, 18 Dec 2017 07:18:23 GMT"
 },
 "body": "\u001f\ufffd\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0003\ufffd]k\ufffd\u0014DZ\ufffd/\ufffdYI\ufffd#\ufffd*\ufffdo\ufffd\ufffd\ufffd\u0002\t\u0010^\ufffd\u001c\u000eE=\ufffd{\ufffdb\ufffd\ufffdE\ufffd\ufffdC\ufffd\ufffdf\ufffd,\ufffd\u003e\ufffd\ufffd\ufffd\u001ef\u001a\u0008\u0005\ufffd\ufffdg\ufffd\ufffd\ufffdYYU\ufffd\ufffd;\ufffdoN\ufffd\ufffd\ufffdg\ufffd\u0011UdK\ufffd\u0015\u0015\ufffdo\u000eH\ufffd\u000c\u0015Iq\ndC\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd ... "
}

我们正在考虑在预处理数据包json文件中解压缩内容。有人能告诉我,我需要使用java解压缩压缩的“body”json属性吗?

java json gzip httpresponse packetbeat
2个回答
1
投票

您的数据无法恢复。一般来说,我建议使用Base64编码来传输打包成JSON的二进制数据,但是如果你喜欢试验,你可以阅读Binary Data in JSON String. Something better than Base64中可能的替代方法。

否则,从理论上讲,您可以使用String.getBytes()的变体来获取字节数组,并将结果包装到提到的(在其他答案中)流中:

byte bodyBytes[]=body.getBytes();
ByteArrayInputStream bais=new ByteArrayInputStream(bodyBytes);
GZipInputStream gis=new GZipInputStream(bais);
<do something with gis here, perhaps use an additional DataInputStream>

除了String-thing(通常不是一个好主意)之外,这是解压缩gzip压缩字节数组的方法。 但是,有效的gzip数据以幻数0x1F,0x8B开头(参见Wikipedia,或者您也可以挖掘实际规格)。您的数据以0x1F(\u001F部分)开头,但继续使用\ufffd Unicode字符,这是替换字符(请再次参阅Wikipedia)。 有些工具编码二进制数据并且不喜欢0x8B,很可能是因为它是> = 0x80。如果你进一步读入你的JSON,其中有许多\ufffd-s,高于(或等于)0x80的所有值都已被替换为此。因此,即使JSON支持内部的原始二进制数据(但事实并非如此),此刻的数据仍然无法恢复。


0
投票

在Java中,您可以使用GZIPInputStream类来解码GZIP数据,我认为您需要先将值转换为ByteArrayInputStream。

© www.soinside.com 2019 - 2024. All rights reserved.