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 编码

Download history 2183/week @ 2024-05-04 3371/week @ 2024-05-11 2406/week @ 2024-05-18 2127/week @ 2024-05-25 2239/week @ 2024-06-01 1657/week @ 2024-06-08 1502/week @ 2024-06-15 2178/week @ 2024-06-22 2643/week @ 2024-06-29 2519/week @ 2024-07-06 2053/week @ 2024-07-13 2168/week @ 2024-07-20 1925/week @ 2024-07-27 2156/week @ 2024-08-03 1724/week @ 2024-08-10 1569/week @ 2024-08-17

7,703 每月下载量
5 个crate中(3 个直接) 使用

Apache-2.0

735KB
5.5K SLoC

jsonb — 构建状态 最新版本 crate下载

jsonb 是受 PostgreSQLCockroachDB 启发的二进制格式 JSON 表示。它提供了一个快速、轻量级且易于使用的API来处理 JSON 数据。

特性

  • 良好的兼容性:jsonb 完全支持 JSON 标准,可以用于存储复杂的数据结构。
  • 快速性能:jsonb 为高性能而设计,允许您轻松地处理大型 JSON 数据集。
  • 易于使用:jsonb 提供了多个内置函数以支持各种操作,并支持 JSONPath 语法来选择和提取子集元素。
  • 安全和可靠:jsonb 使用 Rust 编写,提供了内存和线程安全保证,使其成为处理敏感数据的理想选择。

编码格式

jsonb 编码格式是一个类似树的结构。每个节点包含一个容器头、多个 JEntry 头和嵌套的编码值。

  • 32位容器头。3位用于标识值类型,包括 scalarobjectarray,而 29 位用于标识 arrayobject 中的 JEntry 数量。jsonb 值的根节点始终是一个容器头。
    • scalar 容器头:0x20000000
    • object 容器头:0x40000000
    • array 容器头: 0x80000000
  • 32位JEntry头。1位标识JEntry存储长度还是偏移量,3位标识值的类型,包括 nullstringnumberfalsetruecontainer,剩余的28位标识编码值的长度或偏移量。
    • null JEntry头: 0x00000000
    • string JEntry头: 0x10000000
    • number JEntry头: 0x20000000
    • false JEntry头: 0x30000000
    • true JEntry头: 0x40000000
    • container JEntry头 0x50000000
  • 编码值。不同类型的JEntry头有不同的编码值。
    • nulltruefalse:没有编码值,由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>"] .<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