Python对象列表能否编码后供zlib.compress压缩并在Angular解压?
问题答复
直接编码可行性说明
这类JSON结构的对象列表不能直接编码为UTF-8传入zlib.compress。原因是Python中的列表属于内存对象,UTF-8编码仅支持对字符串类型的内容做转换,直接对列表对象调用encode方法会抛出类型错误。
完整实现方案
Python侧(压缩端)
操作流程如下:
- 先将Python对象列表序列化为标准JSON字符串,使用
json.dumps()方法即可,你给出的示例结构完全符合JSON规范,序列化不会有兼容性问题 - 将JSON字符串编码为UTF-8字节流,调用字符串的
encode('utf-8')方法 - 传入
zlib.compress()完成压缩,压缩后如果需要在前后端之间传输,建议将压缩后的字节流编码为Base64字符串,避免传输过程中二进制数据损坏
示例代码:
import zlib import json import base64 # 待压缩的对象列表 data_list = [{"name":"value1","y":0.0}, {"name":"value2","y":1.0}] # 1. 序列化为JSON字符串 json_str = json.dumps(data_list) # 2. 编码为UTF-8字节流 utf8_bytes = json_str.encode('utf-8') # 3. zlib压缩 compressed_bytes = zlib.compress(utf8_bytes) # 4. 转Base64字符串方便传输 compressed_base64 = base64.b64encode(compressed_bytes).decode('ascii')
Angular侧(解压端)
操作流程如下:
- 拿到传输过来的Base64编码的压缩内容,先解码为二进制字节流
- 调用zlib兼容的JS解压库
pako完成解压,这是目前前端最常用的zlib格式解压实现 - 将解压后的字节流转为UTF-8字符串
- 调用
JSON.parse()还原为原始的对象列表
示例代码:
首先安装依赖:npm install pako @types/pako(TS项目需要同步安装类型定义包)
解压逻辑:
import * as pako from 'pako'; // 后端返回的Base64格式压缩内容 const compressedBase64 = '替换为实际拿到的压缩字符串'; // 1. Base64转二进制字节流 const binaryString = atob(compressedBase64); const compressedBytes = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) { compressedBytes[i] = binaryString.charCodeAt(i); } // 2. zlib格式解压 const decompressedBytes = pako.inflate(compressedBytes); // 3. 转UTF-8字符串 const jsonStr = new TextDecoder('utf-8').decode(decompressedBytes); // 4. 还原为原始对象列表 const originData = JSON.parse(jsonStr);
注意事项
- 如果对象列表包含非ASCII字符(比如中文),只要序列化和编码阶段统一使用UTF-8,不会出现乱码问题
- 数据量特别大的场景下,可以在Python侧调整zlib的压缩等级(
zlib.compress的第二个参数支持传入1-9,数字越大压缩比越高、压缩速度越慢),按需平衡性能和压缩效率
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

