如何获取RapidJSON模式来处理默认属性

时间:2016-10-14 10:46:29

标签: c++ json jsonschema rapidjson

我有以下JSON架构,它需要idcontent,但默认后者为空字符串。

{
    "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

有谁知道我可能做错了什么?

感谢。

4 个答案:

答案 0 :(得分:2)

截至今天,你的牛肉是JSON Schema validation spec,而不是RapidJSON:

  

4.3. Default values for missing keywords

     

有些关键字,如果没有, MAY 被实现视为具有默认值。在这种情况下,将提到默认值。

结果:处理器被允许忽略缺失值,即使它们具有提供的default值并且仍然符合JSON模式验证规范

  

5.4.3. required

     

5.4.3.2. Conditions for successful validation   如果对象实例的属性集包含此关键字的数组值中的所有元素,则对象实例对此关键字有效。

结果:验证者不得忽略遗漏但必需的属性。

把两者放在一起,给出什么?即使在模式验证期间不考虑default属性的required值,RapidJSON仍然可以声明对JSON模式验证的一致性。

您仍然可以在issues page of RapidJson project

中提交增强请求

答案 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"