2016-04-14 82 views
4

我很難弄清楚如何根據其中一個屬性的值驗證對象數組。那麼,我有這樣一個JSON對象:JSON模式anyOf基於其中一個屬性進行驗證

{ 
    "items": [ 
     { 
      "name": "foo", 
      "otherProperty": "bar" 
     }, 
     { 
      "name": "foo2", 
      "otherProperty2": "baz", 
      "otherProperty3": "baz2" 
     }, 
     { 
      "name": "imInvalid" 
     } 
    ] 
} 

我想說的是

  1. 項目可以包含anyOf對象,其中名稱可以是「富」或「foo2的」
  2. ,如果它是「 foo」的則唯一有效的其他屬性(必需)是 ‘otherProperty’
  3. 如果名字是‘foo2的’,那麼唯一有效的其他 性質是‘otherProperty2’和‘otherProperty3’既需要
  4. 對於「名稱」,「foo」和「foo2」沒有其他值是有效的
  5. 對象本身在項目數組中是可選的,有些可能會重複。

我試過各種東西,但我似乎無法得到失敗,當我驗證。例如,名稱「imInvalid」應該導致驗證錯誤。這是我最近的模式迭代。我錯過了什麼?

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": ["items"], 
    "properties": { 
     "items": { 
      "type": "array", 
      "minItems": 1, 
      "additionalProperties": false, 
      "properties": { 
       "name": { 
        "anyOf": [ 
         { 
          "type": "object", 
          "required": ["name", "otherProperty"], 
          "additionalProperties": false, 
          "properties": { 
           "otherProperty": { "type": "string" }, 
           "name": { "enum": [ "foo" ] } 
          } 
         },{ 
          "type": "object", 
          "required": ["name", "otherProperty2", "otherProperty3" ], 
          "additionalProperties": false, 
          "properties": { 
           "otherProperty2": { "type": "string" }, 
           "otherProperty3": { "type": "string" }, 
           "name": { "enum": [ "foo2" ] } 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 
+0

我認爲你是嵌套名稱和其他名稱內的財產。 – jmugz3

+0

如果你想寫一個答案,顯示正確的方式,並驗證http://json-schema-validator.herokuapp.com這將是偉大的 - 正如我所說,我已經嘗試了很多不同的事情在過去的情侶沒有運氣的日子。以上只是最近的一次。 –

回答

5

你必須使用枚舉分開什麼是匹配的基本思想,但有一對夫婦錯誤的位置:

  • JSON模式陣列不具備的特性,他們的項目。
  • 在該屬性中,您將名稱定義爲一個屬性,然後保存其他json模式對象。
  • 在你的第二個分支是架構您定義otherProperty3但你的樣品是屬性被稱爲anotherProperty3

試試這個稍微修改版本:

{ 
"$schema": "http://json-schema.org/draft-04/schema#", 
"type": "object", 
"required": ["items"], 
"properties": { 
    "items": { 
     "type": "array", 
     "minItems": 1, 
     "additionalProperties": false, 
     "items": { 
      "anyOf": [ 
       { 
        "type": "object", 
        "required": ["name", "otherProperty"], 
        "additionalProperties": false, 
        "properties": { 
         "otherProperty": { "type": "string" }, 
         "name": { "enum": [ "foo" ] } 
        } 
       },{ 
        "type": "object", 
        "required": ["name", "otherProperty2", "anotherProperty3" ], 
        "additionalProperties": false, 
        "properties": { 
         "otherProperty2": { "type": "string" }, 
         "anotherProperty3": { "type": "string" }, 
         "name": { "enum": [ "foo2" ] } 
        } 
       } 
      ] 
     } 
    } 
} 
} 
+0

哦,不!我很親密。謝謝! –

相關問題