2013-12-23 5 views
9

У меня есть JSON SchemaJSON 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' 
         } 
        } 
       } 
      } 
     } 
    } 
} 

То, что я пытаюсь выразить в собственности детей является то, что это массив объектов, с точно такой же схеме. Это правильный способ описать это?

+0

Почему вы используете синтаксис v3? '' required "' является массивом в v4. – cloudfeet

+0

Вы правы. Тем не менее, я проверяю схему через JSON.NET, который, как я выяснил, не поддерживает синтаксис v4. – William

ответ

11

Используйте id схемы, вы должны ссылаться на

'$ref': 'tp_node' 

Смотрите здесь: http://json-schema.org/latest/json-schema-core.html#anchor30

+3

Решение, предложенное в вопросе (используя '' $ ref ":" # "'), на самом деле лучше, потому что оно работает, даже если схема перемещена/переименована. С помощью вашего решения, если вы переименуете схему, вам нужно изменить кучу ссылок, которые * могут * быть внутренними. – cloudfeet

+0

Это решение предпочтительнее и должно быть принято; в случае изменения схемы он ломается чисто и явно, в отличие от более общего, используя '' $ ref ":" # "', с помощью которого изменения, вероятно, затруднят диагностику ошибок. –

14

Да, ваша схема будет работать. "$ref": "#" указывает на корень документа схемы.

Однако "type": "object" бесполезно:

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

Если $ref присутствует, то все другие ключевые слова игнорируются. Было бы лучше удалить type из схемы #/properties/children/items.

3

использовать определения и $ 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" 
} 
Смежные вопросы