JSON模式 - 递归模式定义

时间:2013-12-23 23:23:28

标签: json jsonschema

我有一个JSON Schema

{
    '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属性中表达的是,它是一个具有完全相同模式的对象数组。这是描述它的正确方法吗?

4 个答案:

答案 0 :(得分:17)

是的,您的架构将起作用。 "$ref": "#"指向架构文档的根目录。

然而,"type": "object"无用:

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

如果存在$ref,则忽略所有其他关键字。最好从type架构中删除#/properties/children/items

答案 1 :(得分:14)

使用您需要参考的架构的id

'$ref': 'tp_node'

见这里: http://json-schema.org/latest/json-schema-core.html#anchor30

答案 2 :(得分:6)

使用定义和$ ref。

您可以将以下架构复制并粘贴到此online 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"
}

答案 3 :(得分:0)

递归示例。

{
  "$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" }
  }
}