2013-12-23 3 views
9

Ich habe ein JSON SchemaJSON Schema - rekursive Schema Definition

{ 
    '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' 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Was ich versuche in den Kindern Eigenschaft auszudrücken ist, dass es eine Reihe von Objekten mit dem gleichen genauen Schema ist. Ist das der richtige Weg, es zu beschreiben?

+0

Warum verwenden Sie v3 Syntax? '" erforderlich "' ist ein Array in v4. – cloudfeet

+0

Sie haben Recht. Ich validiere jedoch Schema über JSON.NET, das, wie ich herausfand, v4-Syntax nicht unterstützt. – William

Antwort

11

Verwenden Sie die id des Schemas Sie

'$ref': 'tp_node' 

Siehe hier verweisen müssen: http://json-schema.org/latest/json-schema-core.html#anchor30

+3

Die in der Frage vorgeschlagene Lösung (mit '" $ ref ":" # "') ist eigentlich besser, weil sie auch funktioniert, wenn das Schema verschoben/umbenannt wird. Mit Ihrer Lösung müssen Sie, wenn Sie das Schema umbenennen, eine Reihe von Referenzen ändern, die * stattdessen * intern sein könnten. – cloudfeet

+0

Diese Lösung ist vorzuziehen und sollte die akzeptierte sein; Im Falle einer Änderung im Schema bricht es sauber und offensichtlich ab, im Gegensatz zu dem allgemeineren, das '" $ ref ":" # "verwendet, mit dem Änderungen wahrscheinlich schwerer zu diagnostizieren sind. –

14

Ja, Ihr Schema funktioniert. Die "$ref": "#" verweist zurück auf den Stamm des Schemadokuments.

jedoch die "type": "object" ist nutzlos:

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

Wenn $ref vorhanden ist, dann werden alle anderen Schlüsselwörter ignoriert werden. Es wäre besser, type aus dem #/properties/children/items Schema zu entfernen.

3

Verwenden Sie Definitionen und $ ref.

Sie können das folgende Schema kopieren und in diese online json/schema editor einfügen und die Ergebnisse überprüfen.

Editor Screenshot:

editor screenshot

Code-Schema:

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