#schema #infer #data #properties #jddf #hint #inferred

app jddf-infer

从示例数据推断 JDDF 架构

1 个不稳定版本

0.1.0 2019年9月11日

#2092数据库接口

MIT 许可证

22KB
372

jddf-infer

jddf-infer 从示例值生成 JDDF 架构。当您想快速构建架构的框架时,只需使用示例数据,它非常有用。

用法

请参阅 jddf-infer --help 获取详细说明,但基本用法如下

$ echo '{"name": "John", "born": "1971-10-19T17:26:48+00:00"}' | jddf-infer
{"properties":{"born":{"type":"timestamp"},"name":{"type":"string"}}}

默认情况下,jddf-infer 从 STDIN 读取示例值,然后生成推断的架构输出到 STDOUT。要使用文件而不是 STDIN,您可以这样调用 jddf-infer

jddf-infer examples.jsonl

jddf-infer 需要其输入为有限序列的 JSON Lines -- 一行 JSON 值,由换行符分隔。基本上,这意味着输入看起来应该像这样

{ "a": "foo" }
123
"asdf"
[1, 2, 3]

提供提示

为了使默认输出可预测且有用,jddf-infer 默认情况下永远不会输出 "values" 或 "discriminator" 形式,因为这需要一些启发式方法来区分这些形式与更常见的 "properties" 形式。

为了避免这种行为,jddf-infer 提供了两个标志,可以多次传递

  • --values-hint=<json pointer> 接受一个指向输入中应推断为 "values" 形式的路径的 JSON Pointer
  • --discriminator-hint=<json pointer> 接受一个 JSON Pointer,它指向输入中应推断为 "discriminator" 形式的 "tag"。

在这两种情况下,如果提示被证明是错误的(例如,如果它指向不存在的路径,或者示例值与提示相矛盾),则忽略该提示。

要传递关于数组元素的提示,请使用 - 作为数组索引。

所有这些都最好通过示例来解释。默认情况下,如果您给 jddf-infer 如下输入

{ "stuff": { "a": "foo", "b": "bar" }}

它将推断出 "properties" 形式

$ echo '{ "stuff": { "a": "foo", "b": "bar" }}' | jddf-infer
{"properties":{"stuff":{"properties":{"a":{"type":"string"},"b":{"type":"string"}}}}}

但是,您可以通过传递 --values-hint 来强制将 /stuff 下的对象视为 "values" 形式

$ echo '{ "stuff": { "a": "foo", "b": "bar" }}' | jddf-infer --values-hint=/stuff
{"properties":{"stuff":{"values":{"type":"string"}}}}

同样,假设您有一个包含以下值的文件

{ "stuff": { "arrayOf": "strings", "array": ["a", "b", "c"]}}
{ "stuff": { "arrayOf": "numbers", "array": [1, 2, 3]}}
{ "stuff": { "arrayOf": "booleans", "array": [true, false, true]}}

默认情况下,jddf-infer 将推断以下架构

$ cat examples.jsonl | jddf-infer
{"properties":{"stuff":{"properties":{"array":{"elements":{}},"arrayOf":{"type":"string"}}}}}

但是,如果您想让 jddf-infer/stuff 作为区分器表单处理,其中 /stuff/arrayOf 是区分器标记,那么请提供一个指向 --discriminator-hint 的引用,指向 /stuff/arrayOf

$ echo examples.jsonl | jddf-infer --discriminator-hint=/stuff/arrayOf | jq
{
  "properties": {
    "stuff": {
      "discriminator": {
        "tag": "arrayOf",
        "mapping": {
          "numbers": {
            "properties": {
              "array": {
                "elements": {
                  "type": "uint8"
                }
              }
            }
          },
          "strings": {
            "properties": {
              "array": {
                "elements": {
                  "type": "string"
                }
              }
            }
          },
          "booleans": {
            "properties": {
              "array": {
                "elements": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      }
    }
  }
}

依赖项

~3–4.5MB
~73K SLoC