web-dev-qa-db-ja.com

JSONスキーマ-再帰的なスキーマ定義

JSONスキーマがあります

{
    'description': 'TPNode',
    'type': 'object',
    'id': 'tp_node',
    'properties': {
        'selector': {
            'type': 'string',
            'required': true
        }, 
        'attributes': {
            'type': 'array',
            'items': {
                'name': 'string',
                'value': 'string'
            }
        },
        'children': {
            'type': 'array',
            'items': {
                'type': 'object',
                '$ref': '#'
            }
        },
        'events': {
            'type': 'array',
            'items': { 
                'type': 'object',
                'properties': {
                    'type': {
                        'type': 'string'
                    },
                    'handler': {
                        'type': 'object'
                    },
                    'dependencies': {
                        'type': 'array',
                        'items': {
                            'type': 'string'
                        }
                     }
                 }
            }
        }
    }
}

私がchildrenプロパティで表現しようとしているのは、それがまったく同じスキーマを持つオブジェクトの配列であるということです。これはそれを説明する正しい方法ですか?

18
William

参照する必要のあるスキーマのidを使用します

'$ref': 'tp_node'

ここを参照してください: http://json-schema.org/latest/json-schema-core.html#anchor

16
Sergey Eremin

はい、スキーマは機能します。 "$ref": "#"は、スキーマドキュメントのルートを指します。

ただし、"type": "object"は役に立ちません。

{
    'type': 'object',
    '$ref': '#'
}

$refが存在する場合、他のすべてのキーワードは無視されます。 #/properties/children/itemsスキーマからtypeを削除することをお勧めします。

17
cloudfeet

定義と$ refを使用します。

次のスキーマをコピーしてこの オンラインjson/schema editor に貼り付け、結果を確認できます。

編集者のスクリーンショット:

editor screenshot

スキーマコード:

{
    "definitions": {
        "TPNode": {
            "title": "TPNode",
            "description": "TPNode",
            "type": "object",
            "properties": {
                "selector": {
                    "type": "string",
                    "required": true
                }, 
                "attributes": {
                    "type": "array",
                    "items": {
                        "title": "Attribute",
                        "type": "object",
                        "properties": {
                            "name": {
                                "type": "string"
                            },
                            "value": {
                                "type": "string"
                            }
                        }
                    }
                },
                "children": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/TPNode"
                    }
                },
                "events": {
                    "type": "array",
                    "items": { 
                        "title": "Event",
                        "type": "object",
                        "properties": {
                            "type": {
                                "type": "string"
                            },
                            "handler": {
                                "type": "object"
                            },
                            "dependencies": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "$ref": "#/definitions/TPNode"
}
7
cuixiping

再帰の例。

{
  "$schema": "http://json-schema.org/draft-07/schema#",

  "definitions": {
    "person": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "children": {
          "type": "array",
          "items": { "$ref": "#/definitions/person" },
          "default": []
        }
      }
    }
  },

  "type": "object",

  "properties": {
    "person": { "$ref": "#/definitions/person" }
  }
}
0
Maxim Petkevich