对未知长度列表字典进行JSON模式验证

j2datikz  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(102)

我有一个JSON文件,格式如下

{
"flows": [
    {
        "item1": ""
    }
]}

我写了一个模式来验证这个,但是它只在列表中有一个项目时才验证,我的问题是列表可以有用户想要的那么多项目,我的“流”项目可以有item1、item2、...... itemX。
这是可能的吗?如果是,怎么做呢?下面是我正在使用的模式

{
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#", 
"$id": "https://example.com/object1678205540.json", 
"title": "Root", 
"type": "object",
"required": [
    "flows"
],
"properties": {
    "flows": {
        "$id": "#root/flows", 
        "title": "Flows", 
        "type": "array",
        "default": [],
        "items":{
            "$id": "#root/flows/items", 
            "title": "Items", 
            "type": "object",
            "required": [
                "item1"
            ],
            "properties": {
                "item1": {
                    "$id": "#root/flows/items/item1", 
                    "title": "Item1", 
                    "type": "string",
                    "default": "",
                    "pattern": "^.*$"
                }
            }
        }

    }
}}

这确实验证了模式的正确性,但是如果我添加了item2或item3等,它就会失败。我不知道列表中的项目数量,显然我不想只有一个1000多行的模式来覆盖所有选项。有没有办法循环模式?或者使它可以在不拆分JSON的情况下泛化模式?

2vuwiymt

2vuwiymt1#

模式属性允许基于正则表达式模式定义可接受的属性名称。附加属性标志允许拒绝未定义的属性。
调整后的架构:

{
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#", 
"$id": "https://example.com/object1678205540.json", 
"title": "Root", 
"type": "object",
"required": [
    "flows"
],
"properties": {
    "flows": {
        "$id": "#root/flows", 
        "title": "Flows", 
        "type": "array",
        "default": [],
        "items":{
            "$id": "#root/flows/items", 
            "title": "Items", 
            "type": "object",
            "required": [
                "item1"
            ],
            "patternProperties": {
                "^item[0-9]+$": {
                    "type": "string",
                    "default": "",
                    "pattern": "^.*$"
                }
            },
            "additionalProperties": false
        }
    }
}}

JSON数据:

{
"flows": [
    {
        "item1": "A1",
        "item2": "A2"
    }
}

{
"flows": [
    {
        "item1": "A1",
        "item2": "A2",
        "reject": "X"  <<< ERROR - additional property
    },
    {                  <<< ERROR - item1 property required
        "item2": "B1",
        "item3": "B2",
    }
]}

相关问题