从外部 JSON 模式导入所有定义
Importing all definitions from an external JSON Schema
我一直在试验 JSON Pointers to reference and reuse JSON schemas。
按照示例,我能够引用在另一个 JSON 模式中声明的特定 属性,一切都按预期进行,但我还没有找到扩展基础 JSON 模式与另一个基本模式的定义,而不必显式引用每个 属性.
似乎这会很有用,但我还没有发现它是否可能的迹象。
想象基本模式 things
:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing.json",
"type": "object",
"additionalProperties": false,
"properties": {
"url": {
"id": "url",
"type": "string",
"format": "uri"
},
"name": {
"id": "name",
"type": "string"
}
},
"required": ["name"]
}
如果我想要一个更具体的 person
模式来重用 thing
的两个属性,我可以这样做:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing/person.json",
"type": "object",
"additionalProperties": false,
"properties": {
"url": {
"$ref": "http://example.com/thing.json#/properties/url",
},
"name": {
"$ref": "http://example.com/thing.json#/properties/name",
},
"gender": {
"id": "gender",
"type": "string",
"enum": ["F", "M"]
},
"nationality": {
"id": "nationality",
"type": "string"
},
"birthDate": {
"id": "birthDate",
"type": "string",
"format": "date-time"
}
},
"required": ["gender"]
}
但是我发现这种方法有两个问题:
- 更新超定义后,还必须更新依赖模式
- 手动维护所有这些引用变成cumbersome/verbose
- 规则(如
required: name
)不是引用定义的一部分
有没有办法通过使用单个全局引用来获得以下有效JSON架构?
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing/person.json",
"type": "object",
"additionalProperties": false,
"properties": {
"url": {
"id": "url",
"type": "string",
"format": "uri"
},
"name": {
"id": "name",
"type": "string"
}
"gender": {
"id": "gender",
"type": "string",
"enum": ["F", "M"]
},
"nationality": {
"id": "nationality",
"type": "string"
},
"birthDate": {
"id": "birthDate",
"type": "string",
"format": "date-time"
}
},
"required": ["name", "gender"]
}
我尝试在架构的根目录中包含 $ref
,如下所示:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://jsonschema.net/thing/person",
"type": "object",
"additionalProperties": false,
"$ref": "http://example.com/thing.json",
"properties": {
"gender": {/* ... */},
"nationality": {/* ... */},
"birthDate": {/* ... */}
},
"required": ["gender"]
}
这具有继承 thing
属性但忽略所有其他属性的效果:
gender: Additional property gender is not allowed
nationality: Additional property nationality is not allowed
birthDate: Additional property birthDate is not allowed
您正在查找 allOf
关键字。 JSON 架构不像我们许多人习惯的那样进行继承。相反,您可以告诉它数据需要对父模式(事物)和子模式(人)都有效。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing.json",
"type": "object",
"properties": {
"url": {
"id": "url",
"type": "string",
"format": "uri"
},
"name": {
"id": "name",
"type": "string"
}
},
"required": ["name"]
}
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing/person.json",
"allOf": [
{ "$ref": "http://example.com/thing.json" },
{
"type": "object",
"properties": {
"gender": {
"id": "gender",
"type": "string",
"enum": ["F", "M"]
},
"nationality": {
"id": "nationality",
"type": "string"
},
"birthDate": {
"id": "birthDate",
"type": "string",
"format": "date-time"
}
},
"required": ["gender"]
}
],
}
或者,如我所愿,更简洁地写成
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing/person.json",
"allOf": [{ "$ref": "http://example.com/thing.json" }],
"properties": {
"gender": {
"id": "gender",
"type": "string",
"enum": ["F", "M"]
},
"nationality": {
"id": "nationality",
"type": "string"
},
"birthDate": {
"id": "birthDate",
"type": "string",
"format": "date-time"
}
},
"required": ["gender"]
}
请注意,使用此方法时,您不能使用 "additionalProperties": false
。出于这个原因,我总是建议人们最好的做法是忽略其他属性,而不是明确禁止它们。
我一直在试验 JSON Pointers to reference and reuse JSON schemas。
按照示例,我能够引用在另一个 JSON 模式中声明的特定 属性,一切都按预期进行,但我还没有找到扩展基础 JSON 模式与另一个基本模式的定义,而不必显式引用每个 属性.
似乎这会很有用,但我还没有发现它是否可能的迹象。
想象基本模式 things
:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing.json",
"type": "object",
"additionalProperties": false,
"properties": {
"url": {
"id": "url",
"type": "string",
"format": "uri"
},
"name": {
"id": "name",
"type": "string"
}
},
"required": ["name"]
}
如果我想要一个更具体的 person
模式来重用 thing
的两个属性,我可以这样做:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing/person.json",
"type": "object",
"additionalProperties": false,
"properties": {
"url": {
"$ref": "http://example.com/thing.json#/properties/url",
},
"name": {
"$ref": "http://example.com/thing.json#/properties/name",
},
"gender": {
"id": "gender",
"type": "string",
"enum": ["F", "M"]
},
"nationality": {
"id": "nationality",
"type": "string"
},
"birthDate": {
"id": "birthDate",
"type": "string",
"format": "date-time"
}
},
"required": ["gender"]
}
但是我发现这种方法有两个问题:
- 更新超定义后,还必须更新依赖模式
- 手动维护所有这些引用变成cumbersome/verbose
- 规则(如
required: name
)不是引用定义的一部分
有没有办法通过使用单个全局引用来获得以下有效JSON架构?
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing/person.json",
"type": "object",
"additionalProperties": false,
"properties": {
"url": {
"id": "url",
"type": "string",
"format": "uri"
},
"name": {
"id": "name",
"type": "string"
}
"gender": {
"id": "gender",
"type": "string",
"enum": ["F", "M"]
},
"nationality": {
"id": "nationality",
"type": "string"
},
"birthDate": {
"id": "birthDate",
"type": "string",
"format": "date-time"
}
},
"required": ["name", "gender"]
}
我尝试在架构的根目录中包含 $ref
,如下所示:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://jsonschema.net/thing/person",
"type": "object",
"additionalProperties": false,
"$ref": "http://example.com/thing.json",
"properties": {
"gender": {/* ... */},
"nationality": {/* ... */},
"birthDate": {/* ... */}
},
"required": ["gender"]
}
这具有继承 thing
属性但忽略所有其他属性的效果:
gender: Additional property gender is not allowed
nationality: Additional property nationality is not allowed
birthDate: Additional property birthDate is not allowed
您正在查找 allOf
关键字。 JSON 架构不像我们许多人习惯的那样进行继承。相反,您可以告诉它数据需要对父模式(事物)和子模式(人)都有效。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing.json",
"type": "object",
"properties": {
"url": {
"id": "url",
"type": "string",
"format": "uri"
},
"name": {
"id": "name",
"type": "string"
}
},
"required": ["name"]
}
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing/person.json",
"allOf": [
{ "$ref": "http://example.com/thing.json" },
{
"type": "object",
"properties": {
"gender": {
"id": "gender",
"type": "string",
"enum": ["F", "M"]
},
"nationality": {
"id": "nationality",
"type": "string"
},
"birthDate": {
"id": "birthDate",
"type": "string",
"format": "date-time"
}
},
"required": ["gender"]
}
],
}
或者,如我所愿,更简洁地写成
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://example.com/thing/person.json",
"allOf": [{ "$ref": "http://example.com/thing.json" }],
"properties": {
"gender": {
"id": "gender",
"type": "string",
"enum": ["F", "M"]
},
"nationality": {
"id": "nationality",
"type": "string"
},
"birthDate": {
"id": "birthDate",
"type": "string",
"format": "date-time"
}
},
"required": ["gender"]
}
请注意,使用此方法时,您不能使用 "additionalProperties": false
。出于这个原因,我总是建议人们最好的做法是忽略其他属性,而不是明确禁止它们。