json-packer
Rust 核心库:轻量、可逆的 JSON 二进制压缩/解压工具。
特性
- 无损压缩:保留原始数值精度(整数、浮点分离编码)
- 确定性输出:相同输入+配置 → 相同二进制结果
- 键名优化:Canonical Huffman 编码,高效压缩对象键
- 可选值池:重复字符串去重(v2 格式,可选)
- 跨平台:纯 Rust,支持 N-API 和 WASM 绑定
- Base64 就绪:直接支持 Base64 编解码
安装
[]
= "0.1.0"
# 或本地开发:
# json-packer = { path = "../core" }
公共 API
// 压缩 / 解压(字节)
;
;
// 压缩 / 解压(Base64)
;
;
// 压缩可选项(无状态,按调用传入)
// 通过 options 压缩的函数(示例,用户可在自己代码中调用 encode::compress_with_options)
// pub fn encode::compress_with_options(v: &Value, opt: &CompressOptions) -> Result<Vec<u8>, Error>;
快速上手
use ;
use json;
let v = json!;
let b64 = compress_to_base64?;
let out = decompress_from_base64?;
assert_eq!;
# Ok::
启用字符串值池(无状态调用)
use ;
use compress_with_options; // 按调用传入,无全局状态
use json;
let opt = CompressOptions;
let v = json!;
let bytes = compress_with_options?; // 启用后会写入值池区
# Ok::
数据格式与版本
- v1(默认):无值池。头部
VERSION=0x01
。 - v2:启用字符串值池(传入
enable_value_pool=true
时自动使用)。头部VERSION=0x02
,写入POOL_LEN
与“值池区”;string 在数据区写is_pool_ref(1b)
决定引用 ID 或内联。 - 确定性:同一输入与相同配置下,输出字节完全一致。
错误类型(节选)
BadMagic
/BadVersion
:头部不合法BitstreamOutOfBounds
/VarintError
:位流或变长整数读写越界IllegalFloat
:浮点为 NaN/±Inf(JSON 不允许)HuffmanError
:霍夫曼构建/解码失败PoolMissing
/PoolIdOutOfRange
:值池引用缺失或越界
注意事项
- 遵循 JSON 规范:不支持 NaN/±Inf。
- Base64 接口既可解码无填充(默认)也兼容标准填充格式。
Demo
仓库包含 demo/
二进制示例:读取 demo/test_large.json
,输出压缩结果与统计。运行:
&&
许可证
MIT