JSON Schema使用null值检查整个json的某些属性

时间:2018-01-03 13:32:02

标签: json jsonschema

我正在尝试编写一个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的字符串。

2 个答案:

答案 0 :(得分:1)

您可以使用非常简单的递归模式执行此操作。 propertiesadditionalProperties关键字仅在验证的数据是对象时适用。如果数据不是对象,则忽略这些关键字。这允许我们通过省略"type": "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" }
    }
  }
}

答案 1 :(得分:0)

{
    "anyOf" :
    [
        {
            "not" :
            {
                "type" : "object"
            }
        },
        {
            "properties" :
            {
                "field_name" :
                {
                    "not" :
                    {
                        "type" : "null"
                    }
                }
            },
            "additionalProperties" :
            {
                "$ref" : "#"
            }
        }
    ]
}

遇到的每个实例要么不是对象,要么检查你的属性是否为null,然后它在所有其他属性上运行过滤器(这是使用指向根对象的$ ref完成)依次递归应用在所有可能的子对象上。

(我假设“空”表示属性已设置且等于null。)