架构V7草案if语句没有详细告知错误(Schema Draft v7 if statement is

2019-10-29 08:47发布

我想验证与如果JsonSchema语句所需的属性,但它不通知我的财产的错误细节。

验证已经做出正确,但错误不指定属性和验证失败。

它的工作原理为对象的根级别所需的性能,但是当我指定对象内必需的属性,它只是警告说,JSON不匹配,并指定thenelse模式的路径。

架构例如:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": [
    "name",
    "partners"
  ],
  "properties": {
    "partners": {
      "type": "array",
      "items": {
        "type": "object",
        "if": {
          "properties": {
            "juridical": {
              "type": "object"
            },
            "natural": {
              "type": "null"
            }
          }
        },
        "then": {
          "properties": {
            "juridical": {
              "required": [ "tradeName" ],
              "properties": {
                "tradeName": {
                  "type": "string"
                }
              }
            }
          }
        },
        "else": {
          "properties": {
            "natural": {
              "required": ["name"],
              "properties": {
                "name": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
}

JSON例如:

{
  "name": "Joao",
  "partners": [
    {
      "juridical": null,
      "natural": {

      }
    },
    {
      "juridical": {
        "tradeName": ""
      },
      "natural": null
    }
  ]
}

它应该警告说,第一个合作伙伴有“名”所要求( Required properties are missing from object: name. ),而不是只告诉我: JSON does not match schema from 'else'.

用一个简单的模式是这样它按预期工作:

架构例如:

{
    "if": { "properties": { "power": { "minimum": 9000 } } },
    "then": { "required": [ "disbelief" ] },
    "else": { "required": [ "confidence" ] }
}

JSON例如:

{ "power": 10000 }

我使用JsonSchemaValidator.net来验证结果。

Answer 1:

基本上,JSON文件或者验证对JSON模式与否。 这个逻辑下山通过所有子模式和条件。

错误消息的内容取决于具体的实现JSON模式验证器。 您使用的一个来自于一个特定的供应商。 正如指出的Relequestal,你不能指望错误消息的具体类型,从具体实施处理,除非它是什么样的供应商文档描述。

如何提交一个建议您使用有关的if-then-else的情况下延长的消息验证的作者,你的情况喂?

替代做法:据我了解,你的目标是获得尽可能多的特定错误信息,尽可能地与这个特定的验证 。 这是它是什么,这样的替代方案可能适合的目标。 由于JSON模式本身是一个JSON文件,因此你可以通过某种一致的方式在架构命名节点,并使用逻辑运算符(“anyOf”(逻辑OR)考虑一个解决办法,“allOf”(逻辑与),“oneOf” (逻辑XOR)),而不是IF-THEN-ELSE。

请注意 :基础架构验证,在“allOf”,“anyOf”的情况下,“oneOf”预计通过的所有模式,直到逻辑条件满足运行。

  • “allOf” - 总是会检查是否JSON文档验证对所有模式(AND)

  • “anyOf” -将检查JSON文档验证至少对1种模式(OR,所以一些验证器实现可能后第一个积极的结果,停止检查,因为它是足够的,以评估对“anyOf”,以真实支票)

  • “oneOf” -总是会检查是否JSON文档通过对所有这些检查验证究竟对应征入伍的模式之一(XOR)

(参见: https://json-schema.org/draft-07/json-schema-validation.html#rfc.section.6.7.1 )

因此,如果验证的情况下不符合上述情况的架构,验证实施可能会产生一些“假阳性”的错误消息方面,因为它会争取VS遇到的所有模式的问题。 它根本无法阅读我们的思想和猜测什么意思,我们通过提供特定的JSON文档,所以它抛出所有对我们的判断和决定。

其中许多解决方案是界定的“司法”和“自然”变种和逻辑将它们合并模式在你的情况下,它似乎你期望:

或者法律是一个对象(+相关约束)和自然不是一个对象法人不是一个对象和自然是一个对象(+相关约束)。

替代方案 (请注意“实例”含有一些测试JSON文件部分):

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": [
    "name",
    "partners"
  ],
  "properties": {
    "partners": {
      "type": "array",
      "items": {
        "type": "object",
        "anyOf" : [
          {"$ref" : "#/definitions/juridical-is-object-and-natural-is-null"},
          {"$ref" : "#/definitions/juridical-is-not-an-object-and-natural-is-an-object"}
        ],
        "required" : ["natural","juridical"]
      }
    }
  },
  "examples" : [
    {
      "name": "Joao",
      "partners": [
        {
          "juridical": null,
          "natural": {

          }
        },
        {
          "juridical": {
            "tradeName": ""
          },
          "natural": null
        }
      ]
    },
    {
      "name": "Joao",
      "partners": [
        {
          "juridical": null,
          "natural": {
            "name" : ""
          }
        },
        {
          "juridical": {
            "tradeName": ""
          },
          "natural": null
        }
      ]
    },
    {
      "name": "Joao",
      "partners": [
        {
          "juridical": null,
          "natural": {

          }
        },
        {
          "juridical": {
            "tradeName": ""
          },
          "natural": null
        },
        {
          "juridical" : [],
          "natural" : {}
        }
      ]
    }
  ],
  "definitions" : {
    "natural" : {
        "is-object" : {
          "type" : "object",
          "required": ["name"],
          "properties": {
            "name": {
              "type": "string"
            }
          }
        },
        "is-not-an-object" : {
          "not" : { "type" : "object" }
        },
    },
    "juridical" : {
      "is-object" : {
        "type" : "object",
        "required": ["tradeName"],
        "properties": {
          "name": {
            "type": "string"
          }
        }
      },
      "is-not-an-object" : {
        "not" : { "type" : "object" }
      },
    },
    "juridical-is-object-and-natural-is-null" : {
      "properties" : {
        "natural" : {"$ref" : "#/definitions/natural/is-not-an-object"},
        "juridical" : {"$ref" : "#/definitions/juridical/is-object"}
      },
    },
    "juridical-is-not-an-object-and-natural-is-an-object" : {
      "properties" : {
        "natural" : {"$ref" : "#/definitions/natural/is-object"},
        "juridical" : {"$ref" : "#/definitions/juridical/is-not-an-object"}
      }
    },
  }
}

笔记:

“不”:{} 模式的错误信息可能是普通用户混乱,但它符合规范: https://json-schema.org/draft-07/json-schema-validation.html#rfc.section.6.7 0.4

更新

正如在评论解释,你是错误的详细信息之后。 鉴于所选择的工具的约束条件进行更复杂的模式的if-then-else的错误细节方面,你有没有尝试重塑使用不同的关键字模式来触发为减少开销的消息越好?

替代方案2

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": [
    "name",
    "partners"
  ],
  "properties": {
    "partners": {
      "type": "array",
      "items" : {
        "properties" : {
          "natural" : {
            "if" : { "type" : "object" },
            "then" : { "required" : ["name"] },
            "dependencies" : {
              "name" : {
                 "properties" : {
                  "name" : {"type" : "string"}
                 }
               }
            }
          },
          "juridical" : {
            "if" : { "type" : "object" },
            "then" : { "required" : ["tradeName"] },
            "dependencies" : {
              "tradeName" : {
                 "propertyNames" : {
                   "enum" : ["tradeName"]
                 },
                 "properties" : {
                  "tradeName" : {"type" : "string"}
                 }
               }
            }
          }
        },
        "anyOf" : [
          {"$ref" : "#/definitions/natural-is-null-juridical-is-an-object"},
          {"$ref" : "#/definitions/natural-is-an-object-juridical-is-null"}
        ]
      }
    }
  },
  "definitions" : {
    "natural-is-null-juridical-is-an-object" : {
        "properties" : {
            "natural" : { "type": "null"},
            "juridical" : { "type" : "object"}
        }
    },
    "natural-is-an-object-juridical-is-null" : {
        "properties" : {
            "natural" : { "type": "object"},
            "juridical" : { "type" : "null"}
        }
    },
  },
  "examples" : [
    {
      "name": "Joao",
      "partners": [
        {
          "juridical": null,
          "natural": {

          }
        },
        {
          "juridical": {
            "tradeName": "",
          },
          "natural": null
        },
        {
          "juridical" : {},
          "natural" : {}
        },
        {
          "juridical" : null,
          "natural" : null
        }
      ]
    },
  ]
} 


文章来源: Schema Draft v7 if statement is not informing error in detail