4个版本 (2个破坏性更新)

0.3.0 2023年5月26日
0.2.0 2023年5月5日
0.1.1 2022年11月22日
0.1.0 2022年8月3日

解析器实现 中排名 856

每月下载量 45

Apache-2.0

89KB
2.5K SLoC

Fluvio Jolt JSON库

JSON到JSON转换Rust库

概述

将转换的“规范”本身作为一个JSON文档的JSON到JSON转换。

Java Jolt 库的Rust版本。

使用示例

fluvio-jolt crate 添加到您的 Cargo.toml 文件中

[dependencies]
fluvio-jolt = { version = "0.3"}

然后,例如,如果您想要重新打包您的JSON记录,您可以执行以下操作

use serde_json::{json, Value};
use fluvio_jolt::{transform, TransformSpec};

let input: Value = serde_json::from_str(r#"
    {
        "id": 1,
        "name": "John Smith",
        "account": {
            "id": 1000,
            "type": "Checking"
        }
    }
"#).unwrap();

let spec: TransformSpec =
serde_json::from_str(r#"[
    {
      "operation": "shift",
      "spec": {
        "name": "data.name",
        "account": "data.account"
      }
    }
  ]"#).unwrap();

let output = transform(input, &spec);

assert_eq!(output, json!({
    "data" : {
      "name": "John Smith",
      "account": {
        "id": 1000,
        "type": "Checking"
      }
    }
}));

支持的操作

  1. shift:从输入树复制数据并将其放入输出树
  2. default:将默认值应用到树上
  3. remove:从树中删除数据

有关执行顺序和DSL语法的更多信息,请参阅 SPEC.md

规范

组合一系列操作规范。每个操作都有自己的DSL(领域特定语言),以便更好地执行其特定任务。

use fluvio_jolt::TransformSpec;

let spec: TransformSpec =
serde_json::from_str(r#"[
    {
      "operation": "shift",
      "spec": {
        "name": "data.name",
        "account": "data.account"
      }
    }
  ]"#).unwrap();

Shift 操作

指定输入JSON中的数据应放置在输出JSON中的位置,换句话说,输入JSON/数据应如何移动以生成输出JSON/数据。

在基本层面上,单个 shift 操作是从输入路径到输出路径的映射,类似于Unix中的 mv 命令,mv /var/data /var/backup/data

输入路径是JSON树结构,输出路径是扁平化的“点表示法”路径表示。

例如,给定以下简单的输入JSON

{
    "id": 1,
    "name": "John Smith",
    "account": {
        "id": 1000,
        "type": "Checking"
    }
}

可以通过复制该输入并修改它以提供每个数据项的输出路径来构建一个简单的规范

{
    "id": "data.id",
    "name": "data.name",
    "account": "data.account"
}

将生成以下输出JSON

{
    "data" : {
        "id": 1,
        "name": "John Smith",
        "account": {
            "id": 1000,
            "type": "Checking"
        }
    }
}

通配符

在键级别上,shift 规范支持通配符和条件
1. * - 匹配所有内容
2. name1|name2|nameN - 匹配指定的任意一个名称

& 通配符

& 查找允许引用由 *| 捕获的值。

&(x,y) 表示向上遍历 x 层路径,并从该层获取第 y 个匹配项。

第 0 次匹配总是整个输入,其余则是 * 匹配的具体内容。

& == &(0) == &(0,0) 以及 &(x) == &(x,0)

这允许规格更紧凑。例如,对于以下输入

{
    "id": 1,
    "name": "John Smith",
    "account": {
        "id": 1000,
        "type": "Checking"
    }
}

要获取以下输出

{
    "data" : {
        "id": 1,
        "name": "John Smith",
        "account": {
            "id": 1000,
            "type": "Checking"
        }
    }
}

使用通配符的规格将是

{
    "*": "data.&0"
}

如果您只想在输出中包含 idname,则规格是

{
    "id|name": "data.&(0)"
}

& 通配符还可以解引用给定节点路径的任何级别的路径

{
    "foo": {
        "bar" : {
            "baz": "new_location.&(0).&(1).&(2)" // &(0) = baz, &(1) = bar, &(2) = foo
            }
        }
    }
}

对于以下输入

{
    "foo": {
      "bar": {
        "baz": "value"
      }
    }
  }

将产生

{
    "new_location": {
      "baz": {
        "bar": {
          "foo": "value"
        }
      }
    }
}

$ 通配符

$ 通配符允许从路径访问匹配的键并将其用于右侧。

请参阅 tests/java/resources/shift 中的测试用例,了解使用示例。

请参阅 这里 的 Java 库文档。

@ 通配符

@ 通配符允许访问路径中匹配键的值并在右侧使用它们。

请参阅 tests/java/resources/shift 中的测试用例,了解使用示例。

请参阅 这里 的 Java 库文档。

Default 操作

如果输入 JSON 中不存在值,则应用默认值。

例如,给定以下简单的输入JSON

{
    "phones": {
        "mobile": 01234567,
        "country": "US"
    }
}

以下是对 default 操作的指定

{
    "phones": {
        "mobile": 0000000,
        "code": "+1"
    }
}

输出 JSON 将是

{
    "phones": {
        "mobile": 01234567,
        "country": "US",
        "code": "+1"
    }
}

如您所见,字段 mobile 保持不变,而 code 有默认的 '+1' 值。

Remove 操作

从输入 JSON 中删除内容。规格结构与输入 JSON 结构匹配。字段的值将被忽略。

例如,给定以下简单的输入JSON

{
    "phones": {
        "mobile": 01234567,
        "country": "US"
    }
}

您可以通过以下对 remove 操作的指定来删除 country

{
    "phones": {
        "country": ""
    }
}

输出 JSON 将是

{
    "phones": {
        "mobile": 01234567
    }
}

贡献

如果您想为项目做出贡献,请阅读我们的 贡献指南

许可协议

此项目受 Apache 许可协议 许可。

依赖关系

~1.4–2.3MB
~47K SLoC