Json模式动态密钥验证

sur*_*abu 11 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
                        }
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

杰森:

{
    "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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

你能告诉我纠正架构吗?

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

t3c*_*b0t 10

我在你的模式中看到你似乎忘记了逃避一些角色或者没有正确地做到这一点:

"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$"
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

它应该是:

"^[A-Z0-9\\._%\\+-]+@[A-Z0-9\\.-]+\\.[A-Z]{2,6}$"
Run Code Online (Sandbox Code Playgroud)

或者没有转义内部/类字符,但我会使用第一个模式,因为我认为它的意图更清晰:

"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$"
Run Code Online (Sandbox Code Playgroud)

你需要有两个,\因为第一个\是第二个逃脱\.随着一个一个它是行不通的,因为没有转义序列\.\+在JavaScript.你想拥有一个\模式本身.

但是patternProperties,默认情况下json架构区分大小写,因此您需要通过添加a-z它来扩展您的电子邮件模式:

"^[A-Za-z0-9\\._%\\+-]+@[A-Za-z0-9\\.-]+\\.[A-Za-z]{2,6}$"
Run Code Online (Sandbox Code Playgroud)

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

您还需要通过"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
}
Run Code Online (Sandbox Code Playgroud)

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


sur*_*abu 6

根据草案 04 更改架构:

{
"type": "object", 
"$schema": "http://json-schema.org/draft-04/schema", 
"patternProperties": {
    "^[A-Za-z0-9\\._%\\+-]+@[A-Za-z0-9\\.-]+\\.[A-Za-z]{2,6}$": {
        "type": "object", 
        "properties": {
            "__from": {
                "type": "string"
            }, 
            "message": {
                "type": "object", 
                "properties": {
                    "from": {
                        "type": "string" 
                    },
                    "detail": {
                        "type": "string"
                    }
                },
                 "required": [ "from","detail"]
            }
        },
        "required": [ "__from","message"]
   }
}, 
"additionalProperties": false
}
Run Code Online (Sandbox Code Playgroud)