2016-10-03 9 views
0

Ich habe dieses JSON-Schema, das ein Array hat, das mehrere Objekte enthält, und jedes Objekt unterscheidet sich leicht von den anderen basierend auf bestimmten Mustern.Ist es möglich, gemeinsame Eigenschaften vor oneOf zu haben?

Beispiel.

[ 
    { 
    "ID": "pgID", 
    "Name": "John", 
    "Surname": "Doe", 
    "ProjectsInvolved": [ 
     "My Project", 
     "My Project 2" 
    ] 
    }, 
    { 
    "ID": "jtID", 
    "Name": "John", 
    "Surname": "Doe", 
    "WorksOn": [ 
     "Monday", 
     "Thursday" 
    ] 
    } 
] 

Das json-Schema für das wäre:

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "type": "array", 
    "items": { 
    "oneOf": [ 
     { 
     "type": "object", 
     "properties": { 
      "ID": { 
      "type": "string", 
      "pattern": "^(pg)\\w*$" 
      }, 
      "Name": { 
      "type": "string" 
      }, 
      "Surname": { 
      "type": "string" 
      }, 
      "ProjectsInvolved": { 
      "type": "array", 
      "items": { 
       "type": "string" 
      } 
      } 
     } 
     }, 
     { 
     "type": "object", 
     "properties": { 
      "ID": { 
      "type": "string", 
      "pattern": "^(jt)\\w*$" 
      }, 
      "Name": { 
      "type": "string" 
      }, 
      "Surname": { 
      "type": "string" 
      }, 
      "WorksOn": { 
      "type": "array", 
      "items": { 
       "type": "string" 
      } 
      } 
     } 
     } 
    ] 
    }, 
    "additionalProperties": false 
} 

Mein Problem ist, dass, obwohl die reale json ähnlich ist, es viele weitere Elemente hat, und es ist bereit, größer zu wachsen, da mehr Zeit vergeht . Daher muss ich fragen, ist es möglich, dass das Schema die identischen Elemente Name und Nachname gruppiert und nur die ID und die Arrays in der oneOf hat?

Ein Beispiel für das vorgeschlagene Schema:

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "type": "array", 
    "items": { 
    "type": "object", 
    "properties": { 
     "Name": { 
     "type": "string" 
     }, 
     "Surname": { 
     "type": "string" 
     }, 
     "oneOf": [ 
     { 
      "ID": { 
      "type": "string", 
      "pattern": "^(pg)\\w*$" 
      }, 
      "ProjectsInvolved": { 
      "type": "array", 
      "items": { 
       "type": "string" 
      } 
      } 
     }, 
     { 
      "ID": { 
      "type": "string", 
      "pattern": "^(jt)\\w*$" 
      }, 
      "WorksOn": { 
      "type": "array", 
      "items": { 
       "type": "string" 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "additionalProperties": false 
} 

Antwort

1

Normalerweise wollen Sie nach den gemeinsamen Sachen im Voraus und die besonderen Bedingungen definieren. Dies erleichtert das Lesen des Schemas und führt zu besseren Fehlermeldungen.

In diesem Beispiel, wenn "ProjectsInvolved" vorhanden ist, dann muss "ID" mit "pg" beginnen und "WorksOn" kann nicht vorhanden sein. Und wenn "WorksOn" vorhanden ist, muss "ID" mit "jt" beginnen und "ProjectsInvolved" darf nicht vorhanden sein.

Es ist möglich, so etwas mit oneOf oder anyOf auch, aber Sie erhalten in der Regel bessere Fehlermeldung mit dependencies.

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "type": "array", 
    "items": { 
    "type": "object", 
    "properties": { 
     "ID": { "type": "string" }, 
     "Name": { "type": "string" }, 
     "Surname": { "type": "string" }, 
     "ProjectsInvolved": { 
     "type": "array", 
     "items": { "type": "string" } 
     }, 
     "WorksOn": { 
     "type": "array", 
     "items": { "type": "string" } 
     } 
    }, 
    "dependencies": { 
     "ProjectsInvolved": { 
     "properties": { 
      "ID": { "pattern": "^(pg)\\w*$" } 
     }, 
     "not": { "required": ["WorksOn"] } 
     }, 
     "WorksOn": { 
     "properties": { 
      "ID": { "pattern": "^(jt)\\w*$" } 
     }, 
     "not": { "required": ["ProjectsInvolved"] } 
     } 
    } 
    }, 
    "additionalProperties": false 
} 
+0

Genau was ich brauchte! Ich wünschte, ich könnte dir ein zusätzliches +1 geben, nur weil du Jason heißt und auf eine JSON-Frage antwortest. : D –

Verwandte Themen