首页 > 解决方案 > 通过 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,...

但我无法在这方面取得太大进展。有没有人对问题可能有任何其他建议?

标签: javanode.jsgzip

解决方案


ObjectOutputStream 是通用 Java 对象序列化机制的一部分,您将很难使其与 nodejs 一起使用。

摆脱对象流并将您的 JSON 直接写入 gzip 流。假设 jsonData 是一个字符串,使用:

gzipOut.write(jsonData.getBytes("UTF8"));
gzipOut.close();

推荐阅读