Надеемся перенести правила рабочей реализации валидатора jQuery в JSONSchema

#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}