Разбор ввода на основе схемы JSON

1

Мы создаем внешний проект для веб-приложения, которое общается с бэкэнд, написанным другой командой. Некоторые из разработчиков работают над обоими проектами и лучше понимают изменения в области бэкэнд и ответных полей.

Недавно у нас были части интерфейса, так как они вносили изменения в части приложения, основанные на изменениях в бэкэнд, не обновляя логику во всех местах. Чтобы смягчить это, я хочу создать концепцию маски/шаблона, в которой будут обрабатываться все данные ответа. Таким образом, остальные члены команды, которые не знакомы с бэкэнд, могут заметить/устранить эти ошибки.

Для этого я рассматриваю использование схемы JSON. Однако вместо простой проверки я хочу проанализировать с ней внутренние данные (удаление полей, отсутствующих в схеме). Таким образом, разработчик, внесший изменения в интерфейсе в ответ на изменение бэкэнд, также должен будет обновить этот шаблон, тем самым вызывая потерю теста до тех пор, пока не будет обновлена вся логика с использованием этой схемы (а не только логика, к которой он коснулся). Я играю с https://www.npmjs.com/package/jsonschema, но у него, похоже, нет способа удалить лишние поля, просто проверьте их.

В JSON Schema, можно также установить additionalProperties флаг. Однако у него есть две проблемы:

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

Возможно, валидатор не подходит для этого, но все, что я нахожу при поиске парсеров схемы JSON. Может ли кто-нибудь вести меня в правильном направлении, чтобы я не изобретал велосипед? Похоже, что эта функциональность очень похожа на то, что уже делает валидатор, и я предпочел бы эту обработку в одном и том же проходе.

Теги:
jsonschema

1 ответ

0
Лучший ответ

Найден валидатор, который делает то, что я хочу: https://github.com/acornejo/jjv. У меня есть removalAdditional который я могу установить, вот быстрый тест, который я сделал:

var jjv = require('jjv')();

var addressSchema = {
    "id": "address",
    "type": "object",
    "properties": {
        "lines": {
            "type": "array",
            "items": {"type": "string"}
        },
        "zip": {"type": "string"},
        "city": {"type": "string"},
        "country": {"type": "string"}
    },
    "required": ["country"]
};

var schema = {
    "id": "person",
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "address": {"$ref": "address"},
        "votes": {"type": "integer", "minimum": 1}
    }
};

var p = {
    "name": "Barack Obama",
    "address": {
        "lines": [ "1600 Pennsylvania Avenue Northwest" ],
        "zip": "DC 20500",
        "city": "Washington",
        "foobar": "baz",
        "country": "USA"
    },
    "a": {
      "b": 1,
      "c": 2
    },
    "votes": "lots",
    "stuff": "yes"
};

jjv.addSchema('address', addressSchema);
jjv.addSchema('schema', schema);
jjv.defaultOptions.checkRequired = true;
jjv.defaultOptions.removeAdditional = true;
console.log(jjv.validate('schema', p));
console.log(p);

И ответ:

    { validation: { votes: { type: 'integer' } } }
    { name: 'Barack Obama',
        address:
         { lines: [ '1600 Pennsylvania Avenue Northwest' ],
             zip: 'DC 20500',
             city: 'Washington',
             country: 'USA' },
        votes: 'lots' }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню