“additionalProperties”可以应用于 JSON Schema 中的嵌套对象吗?

L S*_*L S 5 json jsonschema

我正在开发一个接受以下 JSON 的应用程序:

{
  "gd": { "enabled": true, "show_counts": true },
  "ra": { "enabled": true }
}
Run Code Online (Sandbox Code Playgroud)

我开发了一个 JSON 架构来验证此输入,允许某些键是可选的,其他键是必需的,以及一些最小数量的属性。它运行良好,看起来像这样:

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "gd": {
      "type": "object",
      "required": [ "enabled" ],
      "additionalProperties": false,
      "properties": {
        "enabled": { "type": "boolean" },
        "show_counts": { "type": "boolean" }
      }
    },
    "ra": {
      "type": "object",
      "required": [ "enabled" ],
      "additionalProperties": false,
      "properties": {
        "enabled": { "type": "boolean" }
      }
    }
  },
  "minProperties": 1
}
Run Code Online (Sandbox Code Playgroud)

让我烦恼的一件事是每个对象都重复指定"additionalProperties": false. 我想在顶层指定一次,JSON 文档中的任何位置都不允许模式中未指定的任何属性。

那可能吗?

Eth*_*her 4

在最新草案 (2019-09) 中,您可以通过定义所有模式派生自的“基本模式”来实现此目的:

{
  $defs: {
    base_object: {
      unevaluatedProperties: false
    },
  },
  $ref: '#/$defs/base_object',
  type: 'object',
  // additionalProperties: false does not need to be stated here
  ...
}
Run Code Online (Sandbox Code Playgroud)