Проверка динамического ключа схемы 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
}