java - 通过 gzip 在解压缩字符串中显示未知字符
问题描述
我有一个移动应用程序,我通过 gzip 压缩 JSON 字符串并将数据存储在数据库中。我还有一个 Web 应用程序,它解压缩相同的 JSON 字符串以在网页上显示数据。问题是 JSON 字符串在 Web 应用程序中解压缩时似乎显示了一些未知字符,而在移动应用程序中解压缩时看不到这些字符。
Android 应用程序是用 Java 编写的,并使用以下代码来压缩字符串:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzipOut = null;
try {
gzipOut = new GZIPOutputStream(baos);
ObjectOutputStream objectOut = new ObjectOutputStream(gzipOut);
objectOut.writeObject(jsonData);
objectOut.close();
// Wrapper for the byte array
ServerData nData = new ServerData();
nData.data = baos.toByteArray();
String finalData = JSONObjectStringConverter.json.toJson(nData);
return finalData;
} catch (IOException e) {
e.printStackTrace();
}
以上似乎工作正常,将字节数组存储在包装器中,然后存储到数据库中。
Web 应用程序使用 nodejs 后端,并在从数据库中检索数据并从包装器中删除数据后,使用以下代码对其进行解压缩:
try{
// Convert the byte array back to JSON
const decompressedData = zlib.gunzipSync(new Uint8Array(compressedByteArray) );
jsonData = optionDataInflated.toString();
}catch(e){
console.error(e)
}
同样,这似乎主要工作,但在字符串的开头有一些身份不明的字符:
"��\u0000\u0005t��{\"cloudData\": ..."
我认为这可能与压缩字符串的标头有关(即字节数组中的前 10 个字节):
[31, -117, 8, 0, 0, 0, 0, 0, 0, 0,...
但我无法在这方面取得太大进展。有没有人对问题可能有任何其他建议?
解决方案
ObjectOutputStream 是通用 Java 对象序列化机制的一部分,您将很难使其与 nodejs 一起使用。
摆脱对象流并将您的 JSON 直接写入 gzip 流。假设 jsonData 是一个字符串,使用:
gzipOut.write(jsonData.getBytes("UTF8"));
gzipOut.close();
推荐阅读
- c# - 如何为特定值设置内部枚举?
- angular - Angular 6 材质动画不起作用
- java - 运行 hadoop 命令“无法识别的选项 -”时出错。无法创建 Java 虚拟机
- javascript - JQuery Filterizr 不适用于大型列表
- botframework - FB Messenger 扩展(Web url 按钮)和 bot 框架(源事件)问题
- powershell - 如何在 Powershell 脚本中捕获返回值
- keras - 在 keras 中加载模型
- ionic-framework - 离子构建失败 Firebase-iid-interop.aar
- javascript - Mapbox:禁用滚动缩放,但使用 ctr+scroll 代替
- gradle - 设置不粘在任务之间