2017-03-05 6 views
1

"actions"配列に特定のオブジェクトがあるかどうかを検証しようとしています。各オブジェクトは、typeプロパティに応じて独自のプロパティを持つことができます。アクション配列は、これらのタイプのオブジェクトからの複数の出現を持つことができます。JSON配列のオブジェクトをAjvで検証する

マイJSON:この例では

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

= Xは、B、Cのような特性を必要とした型を持つオブジェクト。配列内のオブジェクト型Yには、d、e、fというプロパティが必要です。

私はスイッチのキーワードでこれを検証しようとしています:

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

しかし、それでもまだ、私は、各オブジェクトタイプは中プロパティで指定された配列のオブジェクトを検証するために、スイッチのキーワードを使用する方法を見つけ出すことができませんでしたそのオブジェクトはそのオブジェクトタイプをプロパティで識別することができます。

答えて

1

あなたのスキーマはほぼ似ていますが、 "type"プロパティが 'X'でも 'Y'でもない場合は、最後に{then: false}サブスキーマが必要です。

{pattern: '^X$'}を使用する代わりに、{enum: ['X']}または{constant: 'X'}(draft-06では「const」)を使用することもできます。スイッチを使用する代わりに、 "if/then/else"(ajv-keywordsから、ドラフト07に含まれる可能性が高い)または "select"を使用することができます。これは、このようなシナリオに適しています。

多分あなたは最後の質問を明確にすることができます、私は理解するとは思わない。

+0

私はそれに偽のサブスキーマを加えました。プロパティ 'a'を削除すると、jsonを検証することができません。それは有効と言います。 –

+1

いいえ、そうではありません:https://runkit.com/esp/58bc33722d90170014fbce7f – esp

+1

ありがとう、問題は私が4.xではなく5.0.3-betaを使用したことでした。 –

関連する問題