LINUX.ORG.RU

Json schema/validator

 , , ,


0

1

Поскольку json-schema - говно я с горя упоролся и наваял свою правильную схему/валидатор

var config = {
    meta : {
        desc : "Bicycle validator example",
        keywords : {
            any : "^ANY",
            or : "_or_",
            notRequired : "^_",
            comment : " - .*$"
        }
    },
    types : {},
    schema : {
        ANY : {
             id : "number - required parameter",
             _name : "string - not required, but can be",
             a_or_b_or_c : "string - need one of them",
             e_or_d : "string - or them",
             _list : ["string","number","string - list with types in this order"],
             _list_etc : ["string","number - repeated list with spectype ...", "..."],
             _st : "anything - any field",
             _anyobj : {ANY : "anything - object with any content"}
        }
    }

}
Фичи/как работает:

  • Отдельно метаданные, отдельно схема, отдельно типы
  • Сама схема записывается так, как будто это объект. Структуры (объект, массив) пишутся как есть, типы пишутся строкой. И никаких сраных "type" : "string" везде и прочей не нужной писанины.
  • Требуемые поля объекта пишутся как есть. Необязательные поля должны соответствовать регулярке notRequired в meta.
  • Если допустимы произвольные наборы полей, то поле должно соответствовать регулярке any в meta
  • Если нужно одно из полей, но не все сразу или некоторые из них, то названия разделяются регуляркой or в meta
  • Из описания типа регуляркой вырезается шаблон комментария
  • Типы должны проверяться. Встроенные - int (целое), number, string. (Еще не тестил)
  • Массивы с типами, последовательностью типов (повтор - спецтип "...", хардкод)
  • Хардкодный тип anything для чего угодно, в т.ч. структур.
  • Можно делать свои типы добавляя функции в types. Функция получает значение, возвращает true - если всё нормально и что угодно другое, если всё плохо. При этом возвращаемое запишется в выдаваемый объект
  • На выходе выдаётся структура подобная входной с пожеланиями для автора в проблемных местах

Планируется

  • Схема в типах
  • Причесать код
  • Протестить работу с типами
  • Сделать тесты для всего
  • Ссылки и вложенные структуры
  • Вызов валидатора типов с параметрами (например intRng 1 100, для целых от 1 до 100 или цепочки типа int rng 1 100)

Говнокод сей поделки там -> https://github.com/Crutchmaster/bvalid-js
Приветствуются предложения, пожелания, проклятия.

Для затравки. Это самая охрененая схема/валидатор. Вы видели json-schema? Дико многословное говно без возможностей которое без костылей невозможно использовать в принципе.

Я понял что эти ублюдочные привязанные к формату схемы нахрен не нужны, а тем более велосипедные. Нужны общие инструменты валидации структуры данных. Вот для python есть voluptuous, я использую его на уже распарсенных данных и доволен на 100%, и когда я переехал с json на yaml не потребовалось менять ровным счётом ничего. И не потребуется, когда я перееду на свой более удобный формат. Единственный минус, пропадает информация о номерах строк в исходном файле.

slovazap ★★★★★ ()
Ответ на: комментарий от theNamelessOne

Может.

{
    meta : {
        _desc : "string",
        keywords : {
            ANY : "string"
        }
    },
    type : {ANY : "anything"},
    schema : {ANY :"anything"}
}
ANY и «_» только надо захардкодить по дефолту.

Используется ли в продакшене?

С понедельника будет. Ковырял json-schema дольше, чем ваял этот велик.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от slovazap
>>> from voluptuous import Required, All, Length, Range
>>> schema = Schema({
...   Required('q'): All(str, Length(min=1)),
...   Required('per_page', default=5): All(int, Range(min=1, max=20)),
...   'page': All(int, Range(min=0)),
... })

Говно какое-то. Мешанину из кода со структурой и я умею делать. Да и затыкается от на первом косяке.

crutch_master ★★★★★ ()
Ответ на: комментарий от crutch_master

Говно какое-то. Мешанину из кода со структурой и я умею делать.

У тебя, как я понял, мешанина сразу структуры, синтаксиса и случайных слов, а функциональных проверок вообще нет. Сходу понять что твоя схема делает невозможно.

Да и затыкается от на первом косяке.

А по другому нельзя, ибо после первого косяка всё автоматически невалидно, и если это пытаться проверять, получишь только кучу неинформативных ложных срабатываний.

slovazap ★★★★★ ()
Ответ на: комментарий от slovazap

А по другому нельзя, ибо после первого косяка всё автоматически невалидно

Да не факт, что сразу и всё.

У тебя, как я понял, мешанина сразу структуры, синтаксиса и случайных слов

Не случайных, а определяемых.

Сходу понять что твоя схема делает невозможно.

Всё там возможно. Она полностью повторяет структуру данных + тут же есть словарик.

функциональных проверок вообще нет

Наделаю всяких функций в всё будет. В type можно писать что угодно, если сильно охота. В понедельник приделаю агрументы и цепочки вызовов.

crutch_master ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Нет бы использовать строготипизированный ЯП

В строго типизированных ЯП-ах работать с JSON ещё неудобней, по крайней мере так писали на ЛОР-е, а на ЛОР-е врать не будут! :)

CryNet ★★ ()
Ответ на: комментарий от tz4678

json-schema как бы стандарт.

Видал я далеко такие стандарты. Разводят писанину на 20 строчек, где можно обойтись двумя. Не нравится - сиди пиши костыли вокруг всего этого добра. Так зачем он нужен, если чтобы его нормально юзать кодить придётся столько же?

crutch_master ★★★★★ ()

IMHO зря ты так, кастомный формат описания того не стоит. Проще юзать стандарт.

Пока сталкивался только со спецификой URL-запросов, когда хочется некоторые поля форм в инты кастовать, а json-schema такого не умеет.

Vit ★★★★★ ()
Ответ на: комментарий от Vit

IMHO зря ты так, кастомный формат описания того не стоит. Проще юзать стандарт.

Так всё равно придётся приделывать свой формат описания, который потом перегонять в стандарт, потому что стандартном без боли пользоваться нельзя. Можно и сюда приделать экспорт в json-schema, но мне пока не нужно.

crutch_master ★★★★★ ()
Ответ на: комментарий от crutch_master

Да вроде стандарт юзабельный. Ни разу не вымораживало на предмет сделать свое и нормально. Правда я не писал на нем километровых портянок.

Vit ★★★★★ ()