2017-09-05 6 views
0

Ich habe ein JSON-Schema und ich habe 3 Arten von Medien, Bildunterschrift, Bild und Avatar.Wie bekomme ich Referenz vom Wert in JSON Schema

Jeder dieser Medientypen hat eine andere Struktur, daher verwende ich $ref und oneOf, um anzugeben, welche Optionen gültig sind.

Allerdings kann ich nicht herausfinden, wie man basierend auf dem Wert eines Geschwisters angeben, welche ref zu verwenden.

Mein Schema sieht wie folgt aus

const mediaSchema = { 
    "type": "object", 
    "required": ["mediaType", "content", "points"], 
    "properties":{ 
     "mediaType": {"type":"string", "pattern": "^(image|avatar|caption)$"}, 
     "content": { 
      "oneOf": [ 
       {"$ref":"#/definitions/image"}, 
       {"$ref": "#/definitions/caption"}, 
       {"$ref": "#/definitions/avatar"} 
      ], 
     } 
    }, 
    "definitions": { 
     "caption": 
      {"type": "object", 
       "required": ["text"], 
       "properties": { 
        "text": {"type": "string"}, 
        "fontSize": {"type": "string", "pattern": "^[0-9]{1,3}px$"} 
      } 
     }, 
     "image": {"type": "string", "format": "url"}, 
     "avatar": 
      {"type": "object", 
       "properties": { 
        "name": {"type": "string"}, 
        "image": {"type": "string", "format":"url"} 
      } 
     } 
    } 
} 

und wenn ich einen Avatar wie

mediaItem = { 
    "mediaType":"avatar", 
    "content": { 
     "name": "user name", 
     "avatar": "https://urlToImage 
    } 
} 

definieren sollte es gültig sein, aber wenn ich definieren einen Avatar als

mediaItem = { 
    "mediaType": "avatar", 
    "content": "https://urlToImage" 
} 

es sollte einen Fehler werfen, da dies für einen Medientyp von Avatar nicht gültig ist.

Antwort

1

Sie auf dem richtigen Weg sind, aber Sie sollten die oneOf Dispatcher an die Wurzel des Schemas setzen, und definieren Sie die "content" mit 3 separate Konstanten als Diskriminator, wie folgt aus:

{ 
    "oneOf": [ 
     { 
      "type": "object", 
      "properties": { 
       "mediaType": { 
        "const": "avatar" 
       }, 
       "content": { "$ref": "#/definitions/avatar" } 
      }, 
      "required": ["mediaType", "content"] 
     }, 
     // ... 
    ], 
    "definitions": { 
     // ... 
    } 
} 

Hinweis: die "const" Schlüsselwort existiert nur in der neuesten Version von JSON-Schema (Draft6). Es kann vorkommen, dass die von Ihnen verwendete Validator-Implementierung dies noch nicht unterstützt. In diesem Fall können Sie "const": "avatar" durch eine Single-Element Enum wie "enum": ["avatar"]

+0

ersetzen, die funktioniert, aber der Fehlerbericht ist ziemlich schlecht. In meinen Tests erwarte ich "data". MediaType sollte gleich sein, data.mediaType sollte gleich sein, data.mediaType sollte gleich sein, data sollte genau einem Schema in oneOf'' entsprechen, ist da ein schöner Fehler ausgegeben? Was schlägt vor, was das Schema sein sollte? – pedalpete

+0

Welche JSON-Schema-Bibliothek verwenden Sie? – erosb

+0

Ich benutze ajv, kennst du es? Wahrscheinlich eine separate Frage, ich dachte, Fehler würden in den Bibliotheken standardisiert. https://github.com/epoberezkin/ajv, ich werde dort nachsehen. Entschuldige, dass ich dich mit dieser Frage belästigt habe. – pedalpete

Verwandte Themen