JSON 架构检查整个 json 是否具有空值的某些 属性
JSON Schema check entire json for certain property with null values
我正在尝试编写一个 json 模式来搜索具有不同结构的任何 json 以查找某个名为 "field_name" 的 属性 的所有出现并检查是否属性 有一个值。不能有空 "field_name".
属性 "field_name" 可以在 json 文件中的任何级别,例如
https://raw.githubusercontent.com/stopopol/deims_apps/master/metadata_models/smm.json
到目前为止我有这个,但是当 "field_name" 为空时它从不抱怨。
{
"$schema": "http://json-schema.org/schema#",
"title": "Metadata Model",
"type": "object",
"required": [
"name",
"abbreviation",
"version",
"releaseDate",
"scope",
"content"
],
"patternProperties": {
"field_name": {
"type": "string",
"minLength": 1
}
}
}
我认为我可以检查 属性 "field_name" 的任何出现,并且它需要是一个长度至少为 1 的字符串。
{
"anyOf" :
[
{
"not" :
{
"type" : "object"
}
},
{
"properties" :
{
"field_name" :
{
"not" :
{
"type" : "null"
}
}
},
"additionalProperties" :
{
"$ref" : "#"
}
}
]
}
遇到的每个实例要么不是对象,要么会检查您的 属性 是否为空,然后对所有其他属性运行过滤器(这是使用指向根对象的 $ref 完成的) 依次将其递归应用于所有可能的子对象。
(我假设 "empty" 你的意思是 属性 已设置并等于 null。)
您可以使用非常简单的递归模式来做到这一点。 properties
和 additionalProperties
关键字仅在被验证的数据是对象时适用。如果数据不是对象,这些关键字将被忽略。这允许我们通过省略 "type": "object"
声明来简单地表达 "if the value is an object" 部分。
allOf
/definitions
的使用展示了如何在不使整个模式递归的情况下表达递归约束。
{
"title": "Metadata Model",
"type": "object",
"required": [
"name",
"abbreviation",
"version",
"releaseDate",
"scope",
"content"
],
"allOf": [{ "$ref": "#/definitions/field_name-not-empty-deep" }],
"definitions": {
"field_name-not-empty-deep": {
"properties": {
"field_name": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": { "$ref": "#/definitions/field_name-not-empty-deep" }
}
}
}
我正在尝试编写一个 json 模式来搜索具有不同结构的任何 json 以查找某个名为 "field_name" 的 属性 的所有出现并检查是否属性 有一个值。不能有空 "field_name".
属性 "field_name" 可以在 json 文件中的任何级别,例如
https://raw.githubusercontent.com/stopopol/deims_apps/master/metadata_models/smm.json
到目前为止我有这个,但是当 "field_name" 为空时它从不抱怨。
{
"$schema": "http://json-schema.org/schema#",
"title": "Metadata Model",
"type": "object",
"required": [
"name",
"abbreviation",
"version",
"releaseDate",
"scope",
"content"
],
"patternProperties": {
"field_name": {
"type": "string",
"minLength": 1
}
}
}
我认为我可以检查 属性 "field_name" 的任何出现,并且它需要是一个长度至少为 1 的字符串。
{
"anyOf" :
[
{
"not" :
{
"type" : "object"
}
},
{
"properties" :
{
"field_name" :
{
"not" :
{
"type" : "null"
}
}
},
"additionalProperties" :
{
"$ref" : "#"
}
}
]
}
遇到的每个实例要么不是对象,要么会检查您的 属性 是否为空,然后对所有其他属性运行过滤器(这是使用指向根对象的 $ref 完成的) 依次将其递归应用于所有可能的子对象。
(我假设 "empty" 你的意思是 属性 已设置并等于 null。)
您可以使用非常简单的递归模式来做到这一点。 properties
和 additionalProperties
关键字仅在被验证的数据是对象时适用。如果数据不是对象,这些关键字将被忽略。这允许我们通过省略 "type": "object"
声明来简单地表达 "if the value is an object" 部分。
allOf
/definitions
的使用展示了如何在不使整个模式递归的情况下表达递归约束。
{
"title": "Metadata Model",
"type": "object",
"required": [
"name",
"abbreviation",
"version",
"releaseDate",
"scope",
"content"
],
"allOf": [{ "$ref": "#/definitions/field_name-not-empty-deep" }],
"definitions": {
"field_name-not-empty-deep": {
"properties": {
"field_name": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": { "$ref": "#/definitions/field_name-not-empty-deep" }
}
}
}