Проверка динамического ключа схемы Json

Возникла проблема с проверкой схемы.

схема:

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

2 ответа

Решение

По вашему шаблону я вижу, что вы, кажется, забыли убежать от некоторых персонажей или сделали это неправильно:

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

и это вызывает ошибку, которую вы видите, когда наводите указатель мыши на ссылку в верхней части валидатора:

так должно быть:

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

или без экранирования внутренних / классовых символов, но я бы использовал первый шаблон, потому что я думаю, что его намерение яснее:

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

Вам нужно иметь два \ потому что первый \ это побег для второго \, С одним из них это не сработает, потому что нет такой escape-последовательности, как \. или же \+ в 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/

Изменена схема в соответствии с черновиком 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
}
Другие вопросы по тегам