为何JSON Schema数组required属性未生效?C# Newtonsoft验证疑问
JSON Schema数组items规则验证问题解析
我使用C#的Newtonsoft库,通过response.IsValid(schema, out IList<string> messages);方法验证JSON响应与JSON Schema时,发现数组的items规则被忽略。我无法理解为何以下Schema能让响应{ "balance": 40.0, "bonuses": [ ] }验证通过,且多个在线验证工具结果一致。
原Schema代码
{ "type": "object", "properties": { "balance": { "type": "number" }, "bonuses": { "type": "array", "items": [ { "type": "object", "properties": { "bonusAmount": { "type": "number" }, "bonusID": { "type": "integer" } }, "required": [ "bonusAmount", "bonusID" ] } ] } }, "required": [ "balance", "bonuses" ] }
问题原因
你把items定义成了数组形式,这种写法在JSON Schema的早期规范(如Draft 3)中用于元组验证——即要求数组的第N个元素匹配对应位置的子Schema。但空数组没有任何元素,自然不存在违反规则的情况,所以验证会通过。
修正方案
如果需要数组中的每一个元素都必须符合指定的对象Schema,要把items改成单个对象(而非数组),修改后的Schema如下:
{ "type": "object", "properties": { "balance": { "type": "number" }, "bonuses": { "type": "array", "items": { "type": "object", "properties": { "bonusAmount": { "type": "number" }, "bonusID": { "type": "integer" } }, "required": [ "bonusAmount", "bonusID" ] } } }, "required": [ "balance", "bonuses" ] }
额外说明
修改后,空数组依然会验证通过(因为没有元素违反规则)。如果需要限制数组至少包含一个元素,可以在bonuses的Schema中添加"minItems": 1规则。
内容的提问来源于stack exchange,提问作者OleksiiK
相关产品推荐
相关产品推荐

