我有一個 JSON 陣列,其中包含具有鍵值對的物件。
[
{ "name": "foo" },
{ "name": "bar" }
]
如果一個name' 等于null我想設定maxItems為1.
我的架構如下所示:
{
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"name": {
"enum": [null, "foo", "bar"]
}
},
"required": [
"name"
]
},
"if": {
"contains": { "properties": { "name": { "const": null } } }
},
"then": {
"maxItems": 1
}
}
它基本上可以作業,但在編譯時輸出警告:
strict mode: missing type "object" for keyword "properties" at "#/if/contains" (strictTypes)
我理解這properties只是物件的一個??關鍵字,我在這里將它應用于陣列的一個實體(實際上是指:陣列物件之一的屬性),但我不知道如何正確解決這個問題。
一個完整的 AJV 最小示例如下所示:
const Ajv = require('ajv');
const ajv = new Ajv();
const schema = {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"name": {
"enum": [null, "foo", "bar"]
}
},
"required": [
"name"
]
},
"if": {
"contains": { "properties": { "name": { "const": null } } }
},
"then": {
"maxItems": 1
}
};
const data = [
{ name: 'foo' },
{ name: 'bar' }
];
const data2 = [
{ name: null }
];
const data3 = [
{ name: 'foo' },
{ name: null }
];
const validate = ajv.compile(schema); // strict mode: missing type "object" for keyword "properties" at "#/if/contains" (strictTypes)
console.log(validate(data)); // true
console.log(validate(data2)); // true
console.log(validate(data3)); // false
uj5u.com熱心網友回復:
規范不要求"type": "object"必須與特定于物件的關鍵字一起出現,例如properties. (實際上,混合和匹配對應于不同型別的關鍵字通常很有用,以允許靈活的資料輸入。)然而,ajv 實作堅持這樣做。
此時您的選擇是添加額外的關鍵字,懇求實作作者修復此行為,或切換到不同的實作。
uj5u.com熱心網友回復:
關鍵字的定義contains表明其值必須是有效的 JSON 模式。所以這個警告是有道理的。為什么不簡單地將 a 添加"type": "object"到架構中contains?
在您看來,作為人類,這可能不是必需的,因為您已經“知道”這些值是物件,但驗證器確實希望這里有一個完整的模式適用于每個陣列值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/471288.html
標籤:json 验证 jsonschema ajv
下一篇:如何防止數字輸入中的尾隨句點?
