2015-01-06 52 views
0

驗證需要幫助找到這個模式的錯誤。它有一個操作符。 架構是在這裏:JsonSchema不與oneOf

`{ 
    "type": "object", 
    "required": [ 
     "type", 
     "body" 
    ], 
    "properties": { 
     "type": { 
      "description": "type of the document to post", 
      "type": "string", 
      "enum": [ 
       "123", 
       "456"      
      ] 
     }, 
     "body": { 
      "type": "object", 
      "description": "body", 
      "oneOf": [{ 
       "$ref": "#/definitions/abc", 
       "$ref": "#/definitions/def" 
      }] 
     } 
    }, 
    "definitions": { 
     "abc": {     
      "type": "array", 
      "description": "abc", 
      "properties" : { 
       "name" : { "type" : "string" } 
     } 
     }, 
     "def": {     
      "type": "array", 
      "description": "users","properties" : { 
       "name" : { "type" : "string" } 
     } 
     } 
    } 
}` 

我的JSON是這樣的:

`{ 
      "type": "123", 
      "body": { 
       "abc": [{ 
        "name": "test" 
       }] 
      } 
     }` 

它不與TV4驗證,我也試過這種online tool。它沒有一個操作符。否則,它不會驗證它的任何工具。

編輯

閱讀的答案後,我修改了模式。新的模式是:

{ 
"type": "object", 
"properties": { 
    "type": { 
     "description": "type of the document to post", 
     "type": "string", 

    }, 
    "body": { 
     "type": "object", 
     "description": "body", 
     "properties": { 
      "customers": { 
       "type": "array" 
      } 
     }, 
     "anyOf": [ 
      { 
       "title": "customers prop", 
       "properties": { 
        "customers": { 
         "type": "array", 
         "description": "customers", 
         "items": { 
          "type": "object", 
          "properties": { 
           "name": { 
            "type": "string" 
           } 
          } 
         } 
        } 
       } 
      } 
     ] 
    } 
    } 
} 

和JSON是這裏

{ 
"type": "customer", 
"body": { 
    "none": [ 
     { 
      "name": "test" 
     } 
    ] 
    } 
} 

但它驗證。我想執行的「客戶」或「用戶」在身上的一個。爲了測試我已經從用戶身上刪除了用戶。

PL幫助。

回答

2

由於您在根級別有類型,因此您可能希望oneOf語句檢查類型爲「customer」的對象是否具有客戶身體(即使我會建議跳過身體並將客戶和用戶直接放在根對象中)。

這與您的示例一起工作,將要求類型爲「客戶」的對象具有「客戶」身體,並澄清匹配,我讓客戶擁有「姓名」屬性,而用戶擁有「用戶名」 :

{ 
    "type": "object", 
    "properties": { 
    "type": { "type": "string" }, 
    "body": { 
     "type": "object", 
     "properties": { 
     "customers": { 
      "type": "array", 
      "items": { "$ref": "#/definitions/customer" } 
     }, 
     "users": { 
      "type": "array", 
      "items": { "$ref": "#/definitions/user" } 
     } 
     } 
    } 
    }, 
    "definitions": { 
    "customer": { 
     "type": "object", 
     "properties": { "name": { "type": "string" } }, 
     "required": [ "name" ] 
    }, 
    "user": { 
     "type": "object", 
     "properties": { "username": { "type": "string" } }, 
     "required": [ "username" ] 
    } 
    }, 
    "oneOf": [ 
    { 
     "properties": { 
     "type": { 
      "pattern": "customer" 
     }, 
     "body": { 
      "required": [ "customers" ] 
     } 
     } 
    }, 
    { 
     "properties": { 
     "type": { 
      "pattern": "user" 
     }, 
     "body": { 
      "required": [ "users" ] 
     } 
     } 
    } 
    ] 
} 
1

當使用"type": "array"那麼項目類型在"items"財產不"properties"屬性定義......還有兩種類型的oneOf是一樣的,但只有一個必須匹配。

嘗試

 ... 
     "definitions": { 
     "abc": {     
      "type": "array", 
      "description": "abc", 
      "items" : { 
       "name" : { "type" : "string" } 
     } 
     }, 
     "def": {     
      "type": "array", 
      "description": "users", 
      "items" : { 
       "username" : { "type" : "string" } 
      } 
     } 
    } 
3

的問題是,數據同時傳遞的子模式的。 oneOf手段「匹配正好一個」 - 如果你想「比賽至少一個」,然後使用anyOf

事實上,你的兩個子模式將通過所有數據。其原因是,properties與數組打交道時忽略。

您大概想要做的是指定數組中項目的屬性。對於這一點,你需要items關鍵字:

"definitions": { 
    "abc": {     
     "type": "array", 
     "items": { 
      "type": "object", 
      "properties" : { 
       "name" : { "type" : "string" } 
      } 
     } 
    } 
} 

(您還需要添加一些不同的約束條件 - 此刻,無論是​​和"def"定義是相同的除了description,這使得oneOf不可能的,因爲它會一直匹配或者都不匹配。)