我有以下JSON架构,它需要id
和content
,但默认后者为空字符串。
{
"type": "object",
"properties": {
"id": { "type": "string" },
"content": { "type": "string", "default": "" }
},
"required": [ "id", "content" ],
"additionalProperties": false
}
我正在尝试验证以下JSON字符串:
{
"id": "some id"
}
为此,我有以下代码:
rapidjson::Document document;
document.Parse(schemaJson.c_str());
rapidjson::SchemaDocument schemaDocument(document);
rapidjson::SchemaValidator validator(schemaDocument);
rapidjson::Document modelDoc;
modelDoc.Parse(modelJson.c_str());
modelDoc.Accept(validator); // Complains about missing property
即使属性具有默认值,接受调用也无法通过验证。
RapidJSON schema documentation声称它符合JSON Schema draft 4。
有谁知道我可能做错了什么?
感谢。
答案 0 :(得分:2)
截至今天,你的牛肉是JSON Schema validation spec,而不是RapidJSON:
4.3. Default values for missing keywords
有些关键字,如果没有, MAY 被实现视为具有默认值。在这种情况下,将提到默认值。
结果:处理器被允许忽略缺失值,即使它们具有提供的default
值并且仍然符合JSON模式验证规范
5.4.3.2. Conditions for successful validation 如果对象实例的属性集包含此关键字的数组值中的所有元素,则对象实例对此关键字有效。
结果:验证者不得忽略遗漏但必需的属性。
把两者放在一起,给出什么?即使在模式验证期间不考虑default
属性的required
值,RapidJSON仍然可以声明对JSON模式验证的一致性。
答案 1 :(得分:2)
这对于你想要实现的目标来说是一个合适的架构。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {},
"id": "example",
"properties": {
"content": {
"default": "1",
"id": "/properties/content",
"type": "string"
},
"id": {
"id": "/properties/id",
"type": "string"
}
},
"required": [
"content",
"id"
],
"type": "object",
"additionalProperties": false
}
另外,我在了解JSON Schema时阅读了here,许多JSON Schema验证器直接忽略了default
关键字。也许你最好不要使用它。
答案 2 :(得分:1)
如果合并了最新的pull request,则在架构中指定missing property
值(非零长度字符串)时,RapidJSON将不再引发"default"
错误。请参阅此unit test作为示例。
请注意,此更新仅会使错误无效,并且不会将默认值填充到要验证的文档中。如果需要这样的行为,用户可以从模式中挖掘出值。
答案 3 :(得分:0)
我刚尝试了一些在线验证器。它们也使你的例子无效。
如果这是您想要的,我建议您删除"content"
中的"required"
。