JSON模式检查整个JSON是否具有空值的特定属性

JSON模式检查整个JSON是否具有空值的特定属性,json,jsonschema,Json,Jsonschema,我试图编写一个json模式,搜索任何具有不同结构的json,查找某个名为“field_name”的属性的所有出现情况,并检查该属性是否有值。“字段名称”不能为空 属性“field_name”可以位于json文件中的任何级别,例如 到目前为止,我有这个,但它从来没有抱怨“字段名”是空的 { "$schema": "http://json-schema.org/schema#", "title": "Metadata Model", "type": "object", "requi

我试图编写一个json模式,搜索任何具有不同结构的json,查找某个名为“field_name”的属性的所有出现情况,并检查该属性是否有值。“字段名称”不能为空

属性“field_name”可以位于json文件中的任何级别,例如

到目前为止,我有这个,但它从来没有抱怨“字段名”是空的

{
  "$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" : "#"
            }
        }
    ]
}
遇到的每个实例不是对象,或者它检查您的属性是否不为null,然后它对所有其他属性运行过滤器(这是使用指向根对象的$ref完成的),然后递归地将其应用于所有可能的子对象


(我假设“empty”是指属性被设置并等于null。)

您可以使用一个非常简单的递归模式来实现这一点。
properties
additionalProperties
关键字仅在验证的数据是对象时适用。如果数据不是对象,则忽略这些关键字。这允许我们通过省略
“type”:“object”
声明来表达“if the value is a object”部分

使用
allOf
/
定义
说明了如何在不使整个模式递归的情况下表达递归约束

{
  "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" }
    }
  }
}

很好的解决方案。@CalmDownVal提供的答案实际上导致了额外的模式冲突,但这一个应用干净,完全符合我的需要。它甚至可以轻松地扩展以检查额外的空字段。太完美了!