8 个不稳定版本 (3 个破坏性)
0.4.1 | 2024年7月18日 |
---|---|
0.4.0 | 2024年5月17日 |
0.3.0 | 2023年10月13日 |
0.2.3 | 2023年7月10日 |
0.1.1 | 2023年3月3日 |
#101 in 编码
7,703 每月下载量
在 5 个crate中(3 个直接) 使用
735KB
5.5K SLoC
jsonb —
jsonb
是受 PostgreSQL 和 CockroachDB 启发的二进制格式 JSON
表示。它提供了一个快速、轻量级且易于使用的API来处理 JSON
数据。
特性
- 良好的兼容性:
jsonb
完全支持JSON
标准,可以用于存储复杂的数据结构。 - 快速性能:
jsonb
为高性能而设计,允许您轻松地处理大型JSON
数据集。 - 易于使用:
jsonb
提供了多个内置函数以支持各种操作,并支持JSONPath
语法来选择和提取子集元素。 - 安全和可靠:
jsonb
使用 Rust 编写,提供了内存和线程安全保证,使其成为处理敏感数据的理想选择。
编码格式
jsonb
编码格式是一个类似树的结构。每个节点包含一个容器头、多个 JEntry 头和嵌套的编码值。
- 32位容器头。3位用于标识值类型,包括
scalar
、object
和array
,而 29 位用于标识array
或object
中的 JEntry 数量。jsonb
值的根节点始终是一个容器头。scalar
容器头:0x20000000
object
容器头:0x40000000
array
容器头:0x80000000
- 32位JEntry头。1位标识JEntry存储长度还是偏移量,3位标识值的类型,包括
null
,string
,number
,false
,true
和container
,剩余的28位标识编码值的长度或偏移量。null
JEntry头:0x00000000
string
JEntry头:0x10000000
number
JEntry头:0x20000000
false
JEntry头:0x30000000
true
JEntry头:0x40000000
container
JEntry头0x50000000
- 编码值。不同类型的JEntry头有不同的编码值。
null
,true
,false
:没有编码值,由JEntry头标识。string
:一个普通的UTF-8字符串。number
:一个编码的数字,用于表示uint64s,int64s和float64s。container
:一个具有递归结构的嵌套json
值。
编码示例
// JSON value
[false, 10, {"k":"v"}]
// JSONB encoding
0x80000003 array container header (3 JEntries)
0x30000000 false JEntry header (no encoding value)
0x20000002 number JEntry header (encoding value length 2)
0x5000000e container JEntry header (encoding value length 14)
0x500a number encoding value (10)
0x40000001 object container header (1 JEntry)
0x10000001 string key JEntry header (encoding value length 1)
0x10000001 string value JEntry header (encoding value length 1)
0x6b string encoding value ("k")
0x76 string encoding value ("v")
Jsonb值
jsonb
值是一个枚举,表示所有种类的JSON
值,并作为将其他数据类型转换为jsonb
二进制格式值的中间形式。
// jsonb value
#[derive(Clone, PartialEq, Eq)]
pub enum Value<'a> {
Null,
Bool(bool),
String(Cow<'a, str>),
Number(Number),
Array(Vec<Value<'a>>),
Object(Object<'a>),
}
内置函数
jsonb
实现了许多常用内置函数。由于大多数函数仅关注值的子集,因此使用容器头和JEntry头可以有效地跳过jsonb
值的中间部分。这避免了耗时耗时的反序列化操作,并提供了非常高的性能。更多信息,请参阅https://docs.rs/jsonb/latest/jsonb/#functions
SQL/JSONPath
SQL/JSONPath 是一种查询语言,用于从 jsonb
值中选择和提取一个子集的元素。
运算符
以下运算符已经实现
运算符 | 描述 | 示例 |
---|---|---|
$ |
根元素 | $ |
@ |
过滤器表达式中的当前元素 | $.event?(@ == 1) |
.* |
选择对象中的所有元素 | $.* |
.<name> |
选择对象中与名称匹配的元素 | $.event |
:<name> |
.<name> 的别名 |
$:event |
[" |
.<name> 的别名 |
$["event"] |
[*] |
选择数组中的所有元素 | $[*] |
[<pos>, ..] |
选择数组中的第 n-th 个元素(基于0) |
$[1, 2] |
[last- <pos>, ..] |
选择数组中倒数第 n-th 个元素 |
$[0,last- 1] |
[<pos1>到<pos2>, ..] |
选择数组中某个范围内的所有元素 | $[1到 last- 2] |
?(<expr>) |
选择匹配过滤器表达式的所有元素 | $?(@.price< 10) |
示例
fn main() {
let json = r#"
{
"name":"Fred",
"phones":[
{
"type":"home",
"number":3720453
},
{
"type": "work",
"number":5062051
}
]
}"#;
let path = r#"$.phones[*]?(@.number == 3720453)"#;
// parse JSON string to jsonb value
let value = jsonb::parse_value(json.as_bytes()).unwrap();
// encode jsonb value to jsonb binary value
let jsonb = value.to_vec();
// parse JSONPath string
let json_path = jsonb::jsonpath::parse_json_path(path.as_bytes()).unwrap();
// select subset value from jsonb binary value
let mut sub_jsonb = Vec::new();
let mut sub_offsets = Vec::new();
jsonb::get_by_path(&jsonb, json_path, &mut sub_jsonb, &mut sub_offsets);
// value={"number":3720453,"type":"home"}
println!("value={}", jsonb::to_string(&sub_jsonb));
}
贡献
jsonb
是一个开源项目,欢迎各种贡献!您可以通过想法、代码或文档来帮助。
许可
本软件遵循Apache许可证2.0版许可。
依赖项
约2.5–3.5MB
约63K SLoC