2016-01-27 99 views
2

我想根據其最大值/最小值(數字)或maximumLength/minimumLength(字符串)驗證模式。 我有一個JSON形式:如何使用json模式驗證字符串和數字

[ 
    { 
    "key":"foo", 
    "title":"Test", 
    "type":"string" 
    } 
] 

和JSON模式:

{ 
"type": "object", 
    "properties": { 
    "foo": { 
     "type": ["number","string"], 
     "maxLength":2, 
     "minLength":0, 
     "minimum":3, 
     "maximum":10 
    } 
    } 
} 

和JSON模式:

{ 
    "foo": "bar" 
} 

爲什麼this example不帶驗證工作?我擁有的模型沒有被驗證爲false。根據this document可以在數組中定義不同的類型,但我們如何根據最小/最大值進行驗證?

回答

1

您的模式正在驗證JSON對象("type":"object")。另外,如果它們具有與鍵"foo"一個屬性,其值必須是一個3 10之間的數,或最大長度的字符串2.

根據您的模式有效對象:

{"foo":6} 
{"foo":"as"} 

無效的對象:

{"foo":60} 
{"foo":"asereje"} 

如果您想驗證陣列,您必須確定您的父對象作爲一個數組,並使用items標誌指定數組項目的模式,例如:

以上
{ 
    "type" : "array", 
    "items" : { 
     "type" : "object", 
     "properties" : { 
      "foo" : { 
       "type" : ["number", "string"], 
       "maxLength" : 2, 
       "minLength" : 0, 
       "minimum" : 3, 
       "maximum" : 10 
      } 
     } 
    } 
} 

架構將驗證下列JSON數組:

[{ 
     "foo" : 6 
    }, { 
     "foo" : "as" 
    } 
] 
+0

我編輯了我的問題以添加模型,以避免與表單混淆。我無法獲得您提供的示例按預期工作。我是否也必須更改我的表單? – John

+0

您可以測試該示例在此處驗證提供的JSON:http://json-schema-validator.herokuapp。com/ – jruizaranguren

+0

你是完全正確的。我想也許這是角度模式形式驗證有問題。 – John

2

您的模式是正確的。您正在使用的驗證程序無法正常工作。這是一個使用anyOf的替代方案。

{ 
    "type": "object", 
    "properties": { 
     "foo": { 
      "anyOf": [ 
       { "$ref": "#/definitions/boundedNumber" } 
       { "$ref": "#/definitions/boundedString" } 
      ] 
     } 
    }, 
    "definitions": { 
     "boundedString": { 
      "type": "string", 
      "maxLength": 2, 
      "minLength": 0 
     }, 
     "boundedNumber": { 
      "type": "number", 
      "minimum": 3, 
      "maximum": 10 
     } 
    } 
} 

儘管時間稍長一些,但有些人會認爲由於類型特定關鍵字的分離,這實際上更容易閱讀/維護。

+0

你的建議適用於json模式,但它仍然不適用於我正在使用的庫:角度模式表單驗證,它也使用json模式。我認爲也許圖書館有什麼問題。 – John

+1

我玩過角度模式表單驗證演示頁面,它看起來像只支持最基本的JSON模式功能。它所支持的甚至完全不符合JSON模式規範。 – Jason

+0

也不應該,UI比JSON Schema目前可以處理的要複雜得多,而且目標是在UI中工作,許多JSON模式規則都是有問題的,這就是爲什麼有一個向UI添加UI詞彙表的建議架構,以減少混淆,並使其易於用於UI生成。 – Anthropic

0

約翰問題是正在產生從組合JSON模式,並且UI模式(形式),字段類型"type" : ["number", "string"]

角模式表格當字段類型被定義它知道驗證對,當其中類型有是多種類型的,它不知道規範的哪一部分是針對表單字段的,所以它會回落到一個文本框中,並且不會單獨爲字符串添加適當的驗證要求。

爲了達到您想要的效果,您需要告訴它您希望使用哪種字段類型。如果它不能確定數據模式中的類型,那麼它在0.8.x版本中不會根據UI模式中設置的類型進行驗證,我相信它已在最新的開發分支中修復。如果不是,如果Git中存在問題,我會優先考慮它。