2017-03-05 1 views
1

Ich versuche zu validieren, ob das Array "Aktionen" bestimmte Objekte hat. Jedes Objekt kann abhängig von der Eigenschaft type eigene Eigenschaften haben. Das Aktions-Array kann mehrere Vorkommen von diesen Art von Objekten haben, nicht nur eines.Überprüfen Sie Objekte im JSON-Array mit Ajv

My JSON:

{ 
    "actions": [ 
     { 
      "type": "X", 
      "a": 1, 
      "b": 2, 
      "c": 3 
     }, 
     { 
      "type": "Y", 
      "d": 1, 
      "e": 2, 
      "f": 3 
     } 
    ] 
} 

In diesem Beispiel ist das Objekt, das Typ hat = X hat erforderliche Eigenschaften als a, b, c. Der Objekttyp Y im Array hat die Eigenschaften d, e, f benötigt.

Ich versuche, dies mit dem Schalter Schlüsselwort zu überprüfen:

{ 
    "type": "object", 
    "required": [ 
     "actions" 
    ], 
    "properties": { 
     "actions": { 
      "type": "array", 
      "items": { 
       "switch": [ 
        { 
         "if": { 
          "properties": { 
           "type": { 
            "pattern": "^X$" 
           } 
          } 
         }, 
         "then": { 
          "required": [ 
           "a", 
           "b", 
           "c" 
          ] 
         } 
        }, 
        { 
         "if": { 
          "properties": { 
           "type": { 
            "pattern": "^Y$" 
           } 
          } 
         }, 
         "then": { 
          "required": [ 
           "d", 
           "e", 
           "f" 
          ] 
         } 
        } 
       ] 
      } 
     }, 
    } 
} 

Aber noch kann ich nicht herausfinden, wie den Schalter Schlüsselwort verwenden, um Objekte von Arrays zu validieren, wobei jeder Objekttyp durch eine Eigenschaft angegeben ist in das Objekt, so dass der Objekttyp mit einer Eigenschaft identifiziert werden kann.

Antwort

1

Ihr Schema sieht fast ok aus, Sie benötigen möglicherweise ein letztes {then: false} Subschema in "switch", da ohne es, wenn die Eigenschaft "type" weder "X" noch "Y" ist, die Validierung erfolgreich ist.

Auch anstelle von {pattern: '^X$'} können Sie {enum: ['X']} oder sogar {constant: 'X'} verwenden (in Entwurf-06 ist es "const"); Anstatt den Schalter zu verwenden, können Sie "if/then/else" (von ajv-keywords, es wird wahrscheinlich in Entwurf 07 enthalten sein) oder sogar "select" verwenden, das für ein solches Szenario geeigneter sein könnte.

Vielleicht können Sie die letzte Frage klären, ich glaube nicht, dass ich verstehe.

+0

Ich habe dann das falsche Teilschema hinzugefügt. Es ist immer noch nicht in der Lage, den JSON zu validieren, wenn ich die Eigenschaft 'a' entferne. Es sagt, dass es gültig ist. –

+1

Nein, tut es nicht: https://runkit.com/esp/58bc33722d90170014fbce7f – esp

+1

ok danke, das Problem war, dass ich 5.0.3-Beta anstelle von 4.x. –