jsonschema - Json 模式动态 key 验证

标签 jsonschema json-schema-validator

面临架构验证问题。

架构:

{
    "type": "object",
    "$schema": "http://json-schema.org/draft-03/schema",
    "id": "#",
    "required": true,
    "patternProperties": {
        "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$": {
            "type": "object",
            "required": true,
            "properties": {
                "_from": {
                    "id": "_from",
                    "type": "string",
                    "required": true
                },
                "message": {
                    "type": "object",
                    "id": "message",
                    "properties": {
                        "detail": {
                            "type": "string",
                            "id": "detail",
                            "required": true
                        },
                        "from": {
                            "type": "string",
                            "id": "from",
                            "required": true
                        }
                    }
                }
            }
        }
    }
}

json:
{
    "tom@example.com": {
        "_from": "giles@gmail.com",
        "message": {
            "from": "Giles@gmail.com",
            "detail": "AnyonewanttomeetmeinParis"
        }
    },
    "harry@example.com": {
        "_from": "giles@gmail.com",
        "message": {
            "from": "Giles@gmail.com",
            "detail": "AnyonewanttomeetmeinParis"
        }
    }
}

这里的关键电子邮件地址是动态的,不知何故它不会验证正则表达式以进行电子邮件验证。

您能否建议我更正架构。

我正在验证使用:http://json-schema-validator.herokuapp.com/index.jsp

最佳答案

我在您的模式中看到您似乎忘记转义某些字符或没有正确执行:

"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$"

当您将鼠标悬停在验证器顶部的链接上时,它会导致您可以看到的错误:

enter image description here

它应该是:
"^[A-Z0-9\\._%\\+-]+@[A-Z0-9\\.-]+\\.[A-Z]{2,6}$"

或者不转义内部/类字符,但我会使用第一个模式,因为我认为它的意图更清晰:
"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$"

你需要有两个 \因为第一个 \是第二个 \ 的转义.如果只有一个它就行不通了,因为没有 escape sequence喜欢 \.\+在 JavaScript 中。你想要一个 \在模式本身。

但是 json 架构 patternProperties默认情况下区分大小写,因此您需要通过添加 a-z 来扩展您的电子邮件模式给它:
"^[A-Za-z0-9\\._%\\+-]+@[A-Za-z0-9\\.-]+\\.[A-Za-z]{2,6}$"

(我没有找到任何其他方式使其不区分大小写)

您还需要通过添加 "additionalProperties": false 来排除任何其他属性名称。旁边patternProperties否则它会捕获与模式不匹配的所有其他内容。

工作模式应该如下所示:
{
    "type": "object", 
    "$schema": "http://json-schema.org/draft-03/schema", 
    "id": "#", 
    "required": true,     
    "patternProperties": {
        "^[A-Za-z0-9\\._%\\+-]+@[A-Za-z0-9\\.-]+\\.[A-Za-z]{2,6}$": {
            "type": "object", 
            "required": true, 
            "properties": {
                "_from": {
                    "id": "_from", 
                    "type": "string", 
                    "required": true
                }, 
                "message": {
                    "type": "object", 
                    "id": "message", 
                    "properties": {
                        "detail": {
                            "type": "string", 
                            "id": "detail", 
                            "required": true
                        }, 
                        "from": {
                            "type": "string", 
                            "id": "from", 
                            "required": true
                        }
                    }
                }
            }
        }
    }, 
    "additionalProperties": false
}

我已经测试过了:http://jsonschemalint.com/

关于jsonschema - Json 模式动态 key 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27705522/

相关文章:

amazon-web-services - 如何在 AWS::Serverless::Api 的 AWS SAM 模板中添加请求验证器?

java - Json 架构验证失败,并出现 MalformedURLException : unknown protocol: classpath error

openapi - 为什么 OpenAPI 不将 '$ref' 定义为允许的属性?

javascript - 如何使用 AJV 根据输入值验证数据?

java - json-schema-validator 的 Maven 依赖问题

javascript - 在 Angular 6 中使用 json 模式验证 json

java - 在 json schema 中使用 ref 到 pojo 时出错

json.net 支持针对 json 数据的 json 模式版本 4 验证

json - 在基于另一个架构对象的json架构上使用条件语句

mongodb - MongoDB中具有动态键字段的JSON模式