#json #safe #memoization #messages #port #size

jsonm

jsonm为Rust实现的压缩库。jsonm通过使用记忆化来压缩JSON消息,是一种快速且安全的方式。jsonm通过去除重复的名字和值,使消息的大小减少几个数量级。

6个版本

使用旧的Rust 2015

0.2.0 2021年11月26日
0.1.4 2019年5月8日
0.1.3 2018年11月8日
0.1.2 2018年9月26日

#208 in 压缩

Download history 58/week @ 2024-03-13 18/week @ 2024-03-20 22/week @ 2024-03-27 51/week @ 2024-04-03 27/week @ 2024-04-10 21/week @ 2024-04-17 41/week @ 2024-04-24 57/week @ 2024-05-01 31/week @ 2024-05-08 42/week @ 2024-05-15 24/week @ 2024-05-22 13/week @ 2024-05-29 73/week @ 2024-06-05 89/week @ 2024-06-12 149/week @ 2024-06-19 67/week @ 2024-06-26

每月 381 次下载
2 crates 中使用

MIT 协议

26KB
614

rust-jsonm

Build Status

jsonm为Rust实现的压缩库。

原始库是用JS编写的,在此处:https://github.com/lennartcl/jsonm

jsonm是一种快速且安全地使用记忆化压缩JSON消息的方法。通过去除重复的名字和值,jsonm可以将消息的大小减少几个数量级。

jsonm打包

[
    { "firstName": "Francis", "lastName": "Doe" },
    { "firstName": "Anna", "lastName": "Smith" },
    { "firstName": "Agent", "lastName": "Smith", "isAlias": true },
    { "firstName": "Anna", "lastName": "Francis" }
]

[ 0,
    ["firstName", "lastName", "Francis", "Doe"],
    [3, 4, "Anna", "Smith"],
    [3, 4, "isAlias", "Agent", 8, true],
    [3, 4, 7, 5]
]

注意它是如何使用记忆化消除所有公共子串,如"firstName"的!jsonm保留了一个字典,以进一步压缩未来的消息。发送上述消息第二次,它变为

[0,[3,4,5,6],[3,4,7,8],[3,4,9,10,8,11],[3,4,7,5],1]

并且

[
    { "firstName": "Bryan", "lastName": "Fuller" },
    { "firstName": "Anna", "lastName": "Adams" },
    { "firstName": "Tim", "lastName": "Peterson" },
    { "firstName": "Francis", "lastName": "Peterson" }
]

变为

[0,[3,4,"Bryan","Fuller"],[3,4,7,"Adams"],[3,4,"Tim","Peterson"],[3,4,5,16]]

通过避免重复,jsonm可以帮助减少从Web服务器发送到客户端的消息大小。它有效地排除了客户端已经知道的所有信息。

安装

[dependencies]
"jsonm" = "0.1"

示例

#[macro_use]
extern crate serde_json;
extern crate jsonm;

use jsonm::packer::{PackOptions, Packer};
use jsonm::unpacker::Unpacker;

let mut packer = Packer::new();
let options = PackOptions::new();
let packed = packer.pack(&json!({ "bar": 1, "foo": "1" }), &options).unwrap(); // packed is ["bar", "foo", "1", "~1", 0]

let mut unpacker = Unpacker::new();
let unpacked: Value = unpacker.unpack(&packed).unwrap(); // unpacked is Object({ "bar": 1, "foo": "1" })

依赖项

~3–5MB
~84K SLoC