#json #jquery-validate #jsonschema
#json #jquery-validate #jsonschema
Вопрос:
Я пытаюсь перенести существующую (и работающую) схему проверки jQuery на стороне клиента в JSONSchema, чтобы позволить себе проверять произвольный JSON как на клиенте, так и на сервере.
Мое приложение, по сути, представляет собой набор гигантских форм с множеством сложной логики, определяющей, какие вопросы следует задавать, на основе ответа пользователя на другие вопросы. Каждая форма содержит более 200 полей.
Прямо сейчас я выполняю проверку только на стороне клиента, и это хорошо работает примерно в 99% случаев. Проблемы с браузером возникали несколько раз, но ничего катастрофического. При этом я хочу выполнить проверку на стороне сервера (!).
После прочтения проекта JSONSchema и просмотра некоторых реализаций v3 кажется, что я могу потерять некоторые из более сложных правил, от которых стало зависеть мое приложение. Я хочу быть уверен, что я ничего не упускаю, прежде чем двигаться слишком далеко в любом направлении.
Несколько примеров:
«Если x == 10, то значение y обязательно, в противном случае это необязательно»
10 может быть буквальным значением, перечислением и т.д., Но мне нужно иметь возможность ссылаться на другое поле в той же структуре и гарантировать, что его значение не только существует, но и эквивалентно определенному типу / значению.
Я думаю, что это рассматривается в этом потоке в списке JSONSchema.
«Если x = сегодняшняя дата, а y = завтрашняя дата, тогда x > y»
Эта логика будет использоваться для обеспечения того, чтобы дата «from» предшествовала дате «to».
Из того, что я вижу, ничего подобного нет, и единственный способ, который я вижу для этого, — передать в качестве схемы только что обработанный фрагмент JSON.
Самое близкое, что я нашел для удовлетворения вышеуказанных потребностей, — это CERNY.
Если я запускаю неправильное дерево, пожалуйста, дайте мне знать. Я также изучил возможность запуска backbone.js как на клиенте, так и на сервере.
tl; dr;
Я хочу поддерживать один набор правил проверки для больших и сложных форм и применять эти правила проверки к произвольным документам JSON как на стороне клиента, так и на стороне сервера.
Ответ №1:
существует много трюков, но не все из них возможны. Например, если x == 10, то требуется y, может быть достигнуто с помощью чего-то вроде (черновик 3):
"type":[
{"properties":{"x":{"enum":[10]}, "y":{"required":true}}},
{"properties":{"x":{"disallow":[{"enum":[10]}]}}}
]
Допустим, это возможно, но очень сложно… схема в основном предназначена для проверки структуры, а не ее содержимого (даже если для этого есть несколько свойств)
Другой возможный способ, который мне лично нравится, — это «расширить» текущий график проверки с помощью внешней схемы на основе URL. Идея состоит в том, чтобы отправить параметры текущего документа по URL, который вернет соответствующую схему в соответствии с этими параметрами.
Пример:
{
"extends":{"$ref":"http://checkCustomValidity/{x}/{y}/"};
}
Где во время «выполнения» схема, отправленная обратно, может быть, {"disallow":"any"}
если не разрешена или {}
если ок
Это полезно, поскольку URL-адрес может использоваться как на стороне клиента, так и на стороне сервера (ваш клиент не будет полностью автономным, но в некоторых случаях вы просто не можете)
В реальной жизни это используется в случаях, когда требуется использовать удаленную службу. Например, если мне действительно нужно проверить, используется ли мой ник уже на сервере во время регистрации. Я кодирую веб-службу на стороне сервера, отвечающую на путь запроса: http://www.server.com/isNicknameUsed/{nickname}