如何避免JSON文件中的冗余?

时间:2019-04-25 17:20:43

标签: json

我有一个用例,其中我需要定义一个json配置来确定给定维度集的键。配置看起来像这样:

{
 "foo": {
  "bar": {
    "a": "abc",
  },
  "car": {
    "a": "xyz",
  },
  "dar": {
    "a": "abc"
  }
}

如何在JSON开头指定“ abc”并重新使用它?上面的例子是一个小的配置。我可能最终会拥有一个较大的配置文件。如果将来有更新,这将有助于使配置保持一致。 JSON是否有可能?我应该探索其他选择吗?

请澄清一下,我的问题是关于避免json配置(而不是架构)中的冗余。

3 个答案:

答案 0 :(得分:0)

definitions关键字是为此用例设计的。

这是链接的规范文档中的一个示例:

{
    "type": "array",
    "items": { "$ref": "#/definitions/positiveInteger" },
    "definitions": {
        "positiveInteger": {
            "type": "integer",
            "exclusiveMinimum": 0
        }
    }
}

在此示例中,如果已经为items的值定义了子模式,则现在引用definitions/positiveInteger中定义的架构。

https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9

注意:您只能在没有子模式的地方使用引用。您不能引用数据,例如枚举的值。

进一步阅读:http://json-schema.org/understanding-json-schema/structuring.html

答案 1 :(得分:0)

JSON本身不支持JSON模式引用。

您可以使用jsonnet来引用或包含其他文件,但我自己并未使用过。

答案 2 :(得分:0)

由于JSON本身不支持这种抽象,因此您需要的是一种通过某种方式生成 JSON文件的方法。让我建议Dhall

您的模板(存储在tmp.dhall中)看起来像

let abc_val = "abc"
in {
   foo = {
      bar = {a = abc},
      car = {a = "xyz"},
      dar = {a = abc}
   }
}

然后,您将使用dhall-to-json生成JSON文件(jq仅用于漂亮地打印结果)。

$ dhall-to-json < tmp.dhall | jq .
{
  "foo": {
    "dar": {
      "a": "abc"
    },
    "car": {
      "a": "xyz"
    },
    "bar": {
      "a": "abc"
    }
  }
}