JSON 架构参考解析
JSON Schema reference resolution
我有一个包含“$ref”标签的 JSON 架构,我正在尝试获取解析了“$ref”标签的 JSON 架构版本。我只是想从 JSON 架构字符串中的定义(标签)中解析“$ref”(即不需要外部解析)。
是否有执行 JSON 架构解析的库? (我目前正在使用 org.everit.json.schema 库,这很棒,但我找不到如何做我需要的事情)。
比如我原来的schema是:
{
"$id": "https://example.com/arrays.schema.json",
"description": "A representation of a person, company, organization, or place",
"title": "complex-schema",
"type": "object",
"properties": {
"fruits": {
"type": "array",
"items": {
"type": "string"
}
},
"vegetables": {
"type": "array",
"items": { "$ref": "#/$defs/veggie" }
}
},
"$defs": {
"veggie": {
"type": "object",
"required": [ "veggieName", "veggieLike" ],
"properties": {
"veggieName": {
"type": "string",
"description": "The name of the vegetable."
},
"veggieLike": {
"type": "boolean",
"description": "Do I like this vegetable?"
}
}
}
}
}
这将解析为类似这样的内容(请注意“#defs/veggie”解析为其内联插入到架构中的定义):
{
"$id": "https://example.com/arrays.schema.json",
"description": "A representation of a person, company, organization, or place",
"title": "complex-schema",
"type": "object",
"properties": {
"fruits": {
"type": "array",
"items": {
"type": "string"
}
},
"vegetables": {
"type": "array",
"items": {
"type": "object",
"required": [ "veggieName", "veggieLike" ],
"properties": {
"veggieName": {
"type": "string",
"description": "The name of the vegetable."
},
"veggieLike": {
"type": "boolean",
"description": "Do I like this vegetable?"
}
}
}
}
}
}
这在一般意义上是不可能的,因为:
- $ref 可能是递归的(即再次引用自身)
- $ref 中的关键字可能会重复包含架构中的某些关键字,这会导致某些逻辑被覆盖。
为什么需要以这种方式更改架构?通常,JSON 架构实现将在根据提供的数据评估架构时自动解析 $refs。
我有一个包含“$ref”标签的 JSON 架构,我正在尝试获取解析了“$ref”标签的 JSON 架构版本。我只是想从 JSON 架构字符串中的定义(标签)中解析“$ref”(即不需要外部解析)。
是否有执行 JSON 架构解析的库? (我目前正在使用 org.everit.json.schema 库,这很棒,但我找不到如何做我需要的事情)。
比如我原来的schema是:
{
"$id": "https://example.com/arrays.schema.json",
"description": "A representation of a person, company, organization, or place",
"title": "complex-schema",
"type": "object",
"properties": {
"fruits": {
"type": "array",
"items": {
"type": "string"
}
},
"vegetables": {
"type": "array",
"items": { "$ref": "#/$defs/veggie" }
}
},
"$defs": {
"veggie": {
"type": "object",
"required": [ "veggieName", "veggieLike" ],
"properties": {
"veggieName": {
"type": "string",
"description": "The name of the vegetable."
},
"veggieLike": {
"type": "boolean",
"description": "Do I like this vegetable?"
}
}
}
}
}
这将解析为类似这样的内容(请注意“#defs/veggie”解析为其内联插入到架构中的定义):
{
"$id": "https://example.com/arrays.schema.json",
"description": "A representation of a person, company, organization, or place",
"title": "complex-schema",
"type": "object",
"properties": {
"fruits": {
"type": "array",
"items": {
"type": "string"
}
},
"vegetables": {
"type": "array",
"items": {
"type": "object",
"required": [ "veggieName", "veggieLike" ],
"properties": {
"veggieName": {
"type": "string",
"description": "The name of the vegetable."
},
"veggieLike": {
"type": "boolean",
"description": "Do I like this vegetable?"
}
}
}
}
}
}
这在一般意义上是不可能的,因为:
- $ref 可能是递归的(即再次引用自身)
- $ref 中的关键字可能会重复包含架构中的某些关键字,这会导致某些逻辑被覆盖。
为什么需要以这种方式更改架构?通常,JSON 架构实现将在根据提供的数据评估架构时自动解析 $refs。