2016-12-11 2 views
0

Ich habe folgendes json-Schema, das drei Arten von Spielzeug definiert, um sich mit diesem json GUI builder (github) verwendet werden:JSON-Schema: Wert basierend auf oneOf

{ 
    "id": "http://some.site.somewhere/entry-schema#", 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "description": "schema for toys in game", 
    "type": "object", 
    "required": [ "type" ], 
    "properties": { 
     "sawObj": { 
      "type": "object", 
      "oneOf": [ 
       { "$ref": "#/definitions/rect" }, 
       { "$ref": "#/definitions/circle" }, 
       { "$ref": "#/definitions/img" } 
      ] 
     } 
    }, 
    "definitions": { 
     "rect": { 
      "properties": { 
       "width": { "type": "integer" }, 
       "height": { "type": "integer" }, 
       "weight": { "type": "integer" } 
      }, 
      "required": [ "width", "height", "weight" ], 
      "additionalProperties": false 
     }, 
     "circle": { 
      "properties": { 
       "radius": { "type": "integer" }, 
       "weight": { "type": "integer" } 
      }, 
      "required": [ "radius", "weight" ], 
      "additionalProperties": false 
     }, 
     "img": { 
      "properties": { 
       "path": { "type": "string" }, 
       "width": { "type": "integer" }, 
       "height": { "type": "integer" }, 
       "weight": { "type": "integer" } 
      }, 
      "required": [ "path", "width", "height", "weight" ], 
      "additionalProperties": false 
     } 
    } 
} 

Wenn ich den Kreis Objekt zum Beispiel wählen ich erhalte eine Ausgabe:

{ 
    "sawObj": { 
    "radius": 0, 
    "weight": 0 
    } 
} 

ich möchte einen Wert „Typ“ hinzufügen, die immer gezwungen wäre, den Benutzer gewählten Art zu reflektieren. Anstatt also etwa so:

{ 
    "sawObj": { 
    "type": "circle", 
    "radius": 0, 
    "weight": 0 
    } 
} 

Wenn der Typ automatisch vom Benutzer Wahl aus dem oneOf Eigenschaft Abschnitt bestimmt wird.

Wie kann ich das mit JSON-Schema tun?

Antwort

0

Ich konnte dies den Enum-Wert tun und nur einen einzigen Wert, der den Typ darstellt. Ich setze auch den Typ Wert wie erforderlich, so dass es immer automatisch auf "Kreis" eingestellt wird.

"circle": { 
    "properties": { 
     "radius": { 
      "type": "integer" 
     }, 
     "weight": { 
      "type": "integer" 
     }, 
     "type": { 
      "type": "string", 
      "enum": ["circle"] 
     } 
    }, 
    "required": ["radius", "weight", "type"], 
    "additionalProperties": false 
} 

Hinweis: Ich möchte darauf hinweisen, dass diese Lösung nicht ideal ist. Ich hoffe, einen besseren Weg zu finden, dies zu tun.