Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何基于类型对象属性的值验证某些对象属性的存在性和值?_Json_Jsonschema - Fatal编程技术网

Json 如何基于类型对象属性的值验证某些对象属性的存在性和值?

Json 如何基于类型对象属性的值验证某些对象属性的存在性和值?,json,jsonschema,Json,Jsonschema,我正在尝试验证JSON,它比下面的内容更复杂,但希望这个简单的示例能够清楚地说明这个问题 在更复杂的模式中,我需要一个对象数组,其中: 所有对象都有一组相同的属性,如名称和类型 Type属性是允许的对象类型的枚举,例如“全职”、“承包商” 根据类型属性的值,定义了每种类型属性集的附加值。例如,“全职”员工有一个工资属性是必需的,一个电子邮件属性是可选的,而“承包商”员工有一个费率属性是必需的,没有可选的附加属性 每个对象中只允许定义的属性 每个对象所需的属性可能包括所有对象通用的属性,例如名称

我正在尝试验证JSON,它比下面的内容更复杂,但希望这个简单的示例能够清楚地说明这个问题

在更复杂的模式中,我需要一个对象数组,其中:

  • 所有对象都有一组相同的属性,如名称类型
  • Type属性是允许的对象类型的枚举,例如“全职”、“承包商”
  • 根据类型属性的值,定义了每种类型属性集的附加值。例如,“全职”员工有一个工资属性是必需的,一个电子邮件属性是可选的,而“承包商”员工有一个费率属性是必需的,没有可选的附加属性
  • 每个对象中只允许定义的属性
  • 每个对象所需的属性可能包括所有对象通用的属性,例如名称类型,以及特定于一种对象类型的属性,例如薪资
这似乎应该是一个常见的问题,但到目前为止,我还没有找到一个似乎完全符合我正在尝试做的事情。这些都很接近,但我无法准确地找出如何将它们应用到和/或哪种方法最适合我的用例,因此希望更好地了解这一领域的人能够提供帮助:

特别是,还不清楚required和additionalProperties关键字应该如何在公共和每对象属性之间工作

到目前为止,我使用的模式存在不必要的重复:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "array",
  "items": {
    "$ref": "#/definitions/Employee"
  },
  "definitions": {
    "Employee": {
      "type": "object",
      "oneOf": [{
        "properties": {
          "Name": { "type": "string" },
          "Type": { "type": "string", "enum": [ "Full-Time" ] },
          "Salary": { "type": "integer" },
          "Email": { "type": "string" }
        },
        "required": [ "Name", "Type", "Salary" ],
        "additionalProperties": false
      },
      {
        "properties": {
          "Name": { "type": "string" },
          "Type": { "type": "string", "enum": [ "Contractor" ] },
          "Rate": { "type": "number" }
        },
        "required": [ "Name", "Type", "Rate" ],
        "additionalProperties": false
      }]
    }
  }
}
要验证此数据,请执行以下操作:

[
  { "Name": "Good First Employee",    "Type": "Full-Time",  "Salary": 100000, "Email": "first.employee@example.com"  },
  { "Name": "Good Second Employee",   "Type": "Full-Time",  "Salary":  90000 },
  { "Name": "Good First Contractor",  "Type": "Contractor", "Rate": 20.00 },
  { "Name": "Good Second Contractor", "Type": "Contractor", "Rate": 25 },
  { "Name": "Bad First Person",       "Type": "Unknown",    "Salary":  90000 },
  { "Name": "Bad Third Employee",     "Type": "Full-Time" },
  { "Name": "Bad Fourth Employee",    "Type": "Full-Time",  "Rate": 49.00 },
  { "Name": "Bad Fifth Employee",     "Type": "Full-Time",  "Salary": 100000, "Phone": "123-123-1234" },
  { "Name": "Bad Second Person" }
]
对于上述数据,名称以“Good”开头的对象是有效的。以“Bad”开头的其余内容无效:

  • 错误的第一人称-无效类型
  • 第三名员工欠薪-工资缺失
  • 第四名员工欠薪-缺少工资,工资率对员工无效
  • 错误的第五名员工-电话对员工无效
  • 错误的第二个人-缺少类型(公共字段)

其中一些是可行的,但有过多的错误消息,无法清楚地指出问题所在。

这是一个常见问题。遗憾的是,对于draft-7JSON模式,您不需要的复制是实现所需的唯一方法

我们(JSON模式核心团队)在为draft-8添加新关键字方面做了大量工作,但尚未发布/完成。-<代码>未评估属性


链接的问题包括很多细节,包括一个OpenAPI规范存在相同问题的示例,并因此使用了大量的重复。新的关键字可以避免大量重复。

这是一个常见的问题。遗憾的是,对于draft-7JSON模式,您不需要的复制是实现所需的唯一方法

我们(JSON模式核心团队)在为draft-8添加新关键字方面做了大量工作,但尚未发布/完成。-<代码>未评估属性

链接的问题包括很多细节,包括一个OpenAPI规范存在相同问题的示例,并因此使用了大量的重复。新的关键词减少了大量重复