如何在数组中强制对象键名称

时间:2018-05-08 22:03:07

标签: yaml jsonschema

我正在使用YAML标记一些公式并使用JSON模式来提供参考模式。 YAML的一个例子可能是:

formula: # equates to '5 + (3 - 2)'
  add:
    - 5
    - subtract: [3, 2]

虽然我已经想出如何使公式的直接子对象(在此示例中为"add")具有正确的密钥名称和类型(使用"oneOf"数组"required" S)。我不确定如何确保数组("subtract")的对象同样使用特定的键名。

到目前为止,我可以使用以下方法确保类型。但是使用这种方法,只要使用的对象与减法类型匹配,就允许任何键名,它不限于subtract

"definitions: {
    "add": {
        "type": "array",
        "minItems": 2,
        "items": {
            "anyOf": [
                { "$ref": "#/definitions/value"}, # value type is an integer which allows for the shown scalar array elements
                { "$ref": "#/definitions/subtract" }
                // other operation types
            ]
        }
    },
    "subtract": {
        "type": "array",
        "minItems": 2,
        "maxItems": 2,
        "items": {
            "anyOf": [
                { "$ref": "#/definitions/value"},
                { "$ref": "#/definitions/add" }
                // other operation types
            ]
        }
    }
    // other operation types
}

如何引入限制,使得数组中对象的键与特定名称匹配,同时还允许标量元素?

1 个答案:

答案 0 :(得分:1)

听起来你想要的是递归引用。

通过创建一个oneOf操作的新定义和value,然后允许那些引用回新定义的项目,你就会有递归引用。

"definitions: {
    "add": {
        "type": "array",
        "minItems": 2,
        "items": { "$ref": "#/definitions/operations_or_values"},
    },
    "subtract": {
        "type": "array",
        "minItems": 2,
        "maxItems": 2,
        "items": { "$ref": "#/definitions/operations_or_values"},
    }
    // other operation types
    "operations_or_values": {
      "anyOf": [
        { "$ref": "#definitions/add" },
        { "$ref": "#definitions/subtract" },
        { "$ref": "#definitions/value" },                 # value type is an integer which allows for the shown scalar array elements
        { "$ref": "#definitions/[OTHERS]" },
      ]
    }
}

我没有时间对此进行测试,但我相信它将会或者接近你需要的东西。如果它不起作用,请告诉我。我可能没有完全理解这个问题。