2016-04-21 112 views
7

我已經看到了這個other question但它不完全相同,我覺得我的問題更簡單,但只是不起作用。對象數組的JSON模式定義

我的數據是這樣的:

[ 
    { "loc": "a value 1", "toll" : null, "message" : "message is sometimes null"}, 
    { "loc": "a value 2", "toll" : "toll is sometimes null", "message" : null} 
] 

我想在一個Node.js的項目中使用AJV的JSON驗證,我已經嘗試了幾種模式,試圖來形容我的數據,但我總是這樣的錯誤:

[ { keyword: 'type', 
    dataPath: '', 
    schemaPath: '#/type', 
    params: { type: 'array' }, 
    message: 'should be array' } ] 

架構我已經試過這個樣子的:

{ 
    "type": "array", 
    "items": { 
    "type": "object", 
    "properties": { 
     "loc": { 
     "type": "string" 
     }, 
     "toll": { 
     "type": "string" 
     }, 
     "message": { 
     "type": "string" 
     } 
    }, 
    "required": [ 
     "loc" 
    ] 
    } 
} 

我也嘗試使用this online tool來生成架構,但這也不起作用,並且爲了驗證這應該輸出正確的結果,我試着對jsonschemavalidator.net進行驗證,但是這也給我帶來了類似的錯誤:

Found 1 error(s) 
Message: 
Invalid type. Expected Array but got Object. 
Schema path: 
#/type 

回答

16

您已經正確定義了您的模式,只是它與您所說的驗證數據不匹配。如果您更改屬性名稱以匹配模式,您仍然有一個問題。如果您想允許「收費」和「消息」爲空,您可以執行以下操作。

{ 
    "type": "array", 
    "items": { 
    "type": "object", 
    "properties": { 
     "loc": { 
     "type": "string" 
     }, 
     "toll": { 
     "type": ["string", "null"] 
     }, 
     "message": { 
     "type": ["string", "null"] 
     } 
    }, 
    "required": [ 
     "loc" 
    ] 
    } 
} 

但是,這與您所得到的錯誤消息無關。該消息意味着您正在驗證的數據不是數組。您發佈的示例數據不應導致此錯誤。你是否在問題中發佈的內容之外運行驗證器?

+0

我甚至沒有對數據進行驗證,現在我只是試圖驗證模式本身。 –

+0

@KyleFalconer,你的模式是有效的。我試過你鏈接的驗證器。我認爲你遇到的問題是它默認將'{}'放在「輸入JSON」字段中。您需要將其更改爲數組。該工具看起來像錯誤與模式有關,但它實際上是無效的數據。 – Jason

+0

當然,你是對的!謝謝一堆! –