JSON-схема экспорта и импорта форм
Полная спецификация JSON-структуры форм платформы Form Make. Используйте этот документ для программного создания форм через функцию импорта.
При импорте поле
idкорневого объекта игнорируется и генерируется автоматически. ПоляupdatedAtиcreatedAtустанавливаются сервером.
Корневой объект
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
title | string | Да | Название формы |
description | string | null | Нет | Описание формы |
settings | object | Да | Объект настроек формы |
questions | array | Да | Массив вопросов и разделов |
Настройки формы (settings)
Объект settings содержит четыре блока конфигурации.
Основные (settings.main)
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
requiredQuestionsByDefault | boolean | true | Новые вопросы обязательны по умолчанию |
disableCopy | boolean | false | Запретить копирование текста формы |
showAnswers | boolean | true | Показывать ответы респонденту после прохождения |
showCorrectAnswers | boolean | true | Показывать правильные ответы |
isUserAuth | number | 0 | Авторизация: 0 — анонимный доступ, 1 — требуется авторизация |
acceptUntil | number | 0 | Дедлайн приёма ответов (Unix timestamp, мс). 0 — без ограничений |
attemptsAllowed | number | 1 | Количество допустимых попыток прохождения |
Оценивание (settings.mark)
| Поле | Тип | Описание |
|---|---|---|
type | number | Режим оценивания: 2 — включено |
system | number | null | Шкала оценивания: 5 — пятибалльная |
marks | array | Массив оценок с порогами |
Каждый элемент массива marks:
| Поле | Тип | Описание |
|---|---|---|
mark | string | Оценка (например "5", "4") |
ball | number | Минимальный порог баллов в процентах (0–100) |
name | string | Название оценки (например "Отлично") |
Пример:
json"mark": {
"type": 2,
"system": 5,
"marks": [
{ "mark": "5", "ball": 85, "name": "Отлично" },
{ "mark": "4", "ball": 70, "name": "Хорошо" },
{ "mark": "3", "ball": 50, "name": "Удовлетворительно" },
{ "mark": "2", "ball": 25, "name": "Неудовлетворительно" },
{ "mark": "1", "ball": 0, "name": "Очень плохо" }
]
}Дополнительные (settings.other)
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
isViewValidQuestion | boolean | true | Подсвечивать валидность вопросов при заполнении |
isViewFinalResult | boolean | false | Показывать финальный результат |
enabledRealTimeAcceptUntill | boolean | false | Включить таймер обратного отсчёта |
durationRealTimeAcceptUntill | number | 60000 | Длительность таймера в миллисекундах |
Кастомизация (settings.customization)
| Поле | Тип | Описание |
|---|---|---|
theme | string | Цветовая тема формы (например "lime", "blue", "violet", "rose") |
Структура вопроса
Каждый элемент массива questions — это объект вопроса. Все типы вопросов разделяют общий набор полей.
Общие поля
| Поле | Тип | Описание |
|---|---|---|
id | string | Уникальный идентификатор (UUID v7) |
type | string | Тип вопроса (см. раздел «Типы вопросов») |
title | string | Текст вопроса или заголовок |
required | boolean | Обязательный ли вопрос для заполнения |
only_correct | boolean | Режим проверки правильных ответов |
settings | object | Настройки вопроса |
answers | array | Варианты ответов |
criterions | array | Критерии (для табличных/матричных вопросов и сопоставления) |
correctIds | string[] | Массив ID правильных ответов |
Настройки вопроса (question.settings)
| Поле | Тип | Описание |
|---|---|---|
balls | boolean | Включена ли балловая оценка за вопрос |
balls_count | number | Количество баллов за правильный ответ |
order | string | Сортировка вариантов: "not" — без сортировки, "word" — по алфавиту, "random" — случайный порядок |
Дополнительные поля (необязательные)
| Поле | Тип | Описание |
|---|---|---|
description | string | null | Описание/инструкция к вопросу |
enabledDescription | boolean | Показывать ли описание |
banner | string | null | URL изображения-баннера вопроса |
comment | string | null | Комментарий автора |
help | object | null | Подсказка для респондента |
Объект help:
| Поле | Тип | Описание |
|---|---|---|
value | string | Текст подсказки |
ball | number | Штраф в баллах за использование подсказки |
Типы вопросов
Все доступные значения поля type:
| Тип | Название | Категория |
|---|---|---|
input_text | Ввод текста | Текст |
text | Текст (без вопроса) | Текст |
phone | Номер телефона | Текст |
email | Электронная почта | Текст |
number | Число | Текст |
link | Ссылка | Текст |
option | Один вариант | Выбор из вариантов |
options | Несколько вариантов | Выбор из вариантов |
choice_grid | Оценка по шкале | Выбор из вариантов |
multi_choice_grid | Оценка по шкале (Мн. выбор) | Выбор из вариантов |
comparison | Сопоставление | Выбор из вариантов |
order | Указание порядка | Выбор из вариантов |
filling_gaps | Заполнение пропусков | Выбор из вариантов |
file | Загрузка файлов | Другое |
section | Раздел (этап) | Другое |
input_text — Ввод текста
Поле для свободного текстового ввода. Поддерживает проверку правильного ответа по точному совпадению.
answers— массив с одним элементом, содержащим эталонный ответ ({ id, label }). Пустой массив, если правильный ответ не задан.correctIds— массив сidправильного ответа изanswers.settings.balls—trueдля включения начисления баллов.help— необязательная подсказка.
json{
"id": "q1",
"type": "input_text",
"title": "Назовите столицу Франции",
"answers": [
{ "id": "a1", "label": "Париж" }
],
"correctIds": ["a1"],
"criterions": [],
"required": true,
"only_correct": true,
"settings": { "balls": true, "balls_count": 2, "order": "not" },
"description": "Введите название города",
"enabledDescription": true,
"help": { "value": "Город на Сене", "ball": 1 }
}text — Информационный блок
Текстовый блок без поля для ответа. Используется для инструкций, пояснений и промежуточных комментариев внутри формы.
answers— всегда пустой массив.correctIds— не используется.settings.balls—false.
json{
"id": "q2",
"type": "text",
"title": "Внимательно прочитайте условия перед следующим блоком вопросов",
"answers": [],
"correctIds": [],
"criterions": [],
"required": true,
"only_correct": false,
"settings": { "balls": false, "order": "not", "balls_count": 1 }
}phone — Номер телефона
Поле ввода с маской телефонного номера. Без проверки правильного ответа.
json{
"id": "q3",
"type": "phone",
"title": "Укажите контактный номер телефона",
"answers": [],
"correctIds": [],
"criterions": [],
"required": true,
"only_correct": false,
"settings": {}
}email — Электронная почта
Поле ввода с валидацией формата email. Без проверки правильного ответа.
json{
"id": "q4",
"type": "email",
"title": "Введите ваш адрес электронной почты",
"answers": [],
"correctIds": [],
"criterions": [],
"required": true,
"only_correct": false,
"settings": {}
}number — Число
Поле для ввода числового значения. Поддерживает проверку правильного ответа.
answers— массив с одним элементом, содержащим правильное число в виде строки.correctIds— массив сidправильного ответа.
json{
"id": "q5",
"type": "number",
"title": "Сколько будет 2 + 2?",
"answers": [
{ "id": "a5", "label": "4" }
],
"correctIds": ["a5"],
"criterions": [],
"required": true,
"only_correct": false,
"settings": { "balls": true, "balls_count": 1, "order": "not" }
}link — Ссылка
Поле ввода с валидацией формата URL. Без проверки правильного ответа.
json{
"id": "q6",
"type": "link",
"title": "Укажите ссылку на ваш GitHub-репозиторий",
"answers": [],
"correctIds": [],
"criterions": [],
"required": true,
"only_correct": false,
"settings": {}
}option — Один вариант ответа
Вопрос с выбором одного правильного варианта из нескольких.
answers— массив вариантов ответа ({ id, label }).correctIds— массив с однимidправильного варианта.settings.order— сортировка:"not","word","random".
json{
"id": "q7",
"type": "option",
"title": "Какой HTTP-метод используется для получения данных?",
"answers": [
{ "id": "a7-1", "label": "GET" },
{ "id": "a7-2", "label": "POST" },
{ "id": "a7-3", "label": "DELETE" },
{ "id": "a7-4", "label": "PATCH" }
],
"correctIds": ["a7-1"],
"criterions": [],
"required": true,
"only_correct": true,
"settings": { "balls": true, "balls_count": 1, "order": "not" }
}options — Несколько вариантов ответа
Вопрос с выбором нескольких правильных вариантов (чекбоксы).
answers— массив вариантов.correctIds— массивidвсех правильных вариантов.
json{
"id": "q8",
"type": "options",
"title": "Выберите технологии, относящиеся к Frontend",
"answers": [
{ "id": "a8-1", "label": "HTML5" },
{ "id": "a8-2", "label": "CSS3" },
{ "id": "a8-3", "label": "React" },
{ "id": "a8-4", "label": "PostgreSQL" },
{ "id": "a8-5", "label": "Docker" }
],
"correctIds": ["a8-1", "a8-2", "a8-3"],
"criterions": [],
"required": true,
"only_correct": true,
"settings": { "balls": true, "balls_count": 1, "order": "random" }
}choice_grid — Оценка по шкале
Матричный вопрос: для каждой строки (критерия) респондент выбирает один вариант из столбцов. Используется для шкальных оценок.
answers— столбцы (шкала значений).criterions— строки (оцениваемые критерии), формат:{ id, label }.correctIds— обычно пустой (субъективная оценка).
json{
"id": "q9",
"type": "choice_grid",
"title": "Оцените ваш уровень владения (от 1 до 5)",
"answers": [
{ "id": "col-1", "label": "1" },
{ "id": "col-2", "label": "2" },
{ "id": "col-3", "label": "3" },
{ "id": "col-4", "label": "4" },
{ "id": "col-5", "label": "5" }
],
"criterions": [
{ "id": "row-1", "label": "HTML/CSS" },
{ "id": "row-2", "label": "JavaScript" },
{ "id": "row-3", "label": "React" }
],
"correctIds": [],
"required": true,
"only_correct": false,
"settings": { "balls": false, "order": "not", "balls_count": 1 }
}multichoicegrid — Оценка по шкале (Мн. выбор)
Матричный вопрос с множественным выбором: для каждой строки можно отметить несколько столбцов.
answers— столбцы таблицы.criterions— строки таблицы.correctIds— массив строк формата"criterionId:answerId", задающий правильные пары «строка:столбец».
json{
"id": "q10",
"type": "multi_choice_grid",
"title": "Сопоставьте технологии с областями применения",
"answers": [
{ "id": "col-1", "label": "React" },
{ "id": "col-2", "label": "Python" },
{ "id": "col-3", "label": "PostgreSQL" }
],
"criterions": [
{ "id": "row-1", "label": "Frontend" },
{ "id": "row-2", "label": "Backend" },
{ "id": "row-3", "label": "Базы данных" }
],
"correctIds": [
"row-1:col-1",
"row-2:col-2",
"row-3:col-3"
],
"required": true,
"only_correct": false,
"settings": { "balls": true, "balls_count": 1, "order": "not" }
}comparison — Сопоставление
Задание на установление соответствия: каждому элементу левого столбца (answers) нужно сопоставить элемент правого столбца (criterions).
answers— элементы левого столбца ({ id, label }).criterions— элементы правого столбца. Каждый критерий содержит полеanswerId, указывающее наidсоответствующего ответа изanswers.correctIds— обычно пустой, связь задаётся черезanswerIdвcriterions.
json{
"id": "q11",
"type": "comparison",
"title": "Сопоставьте HTTP-коды с их значениями",
"answers": [
{ "id": "left-1", "label": "200" },
{ "id": "left-2", "label": "404" },
{ "id": "left-3", "label": "500" }
],
"criterions": [
{ "id": "right-1", "label": "OK", "answerId": "left-1" },
{ "id": "right-2", "label": "Not Found", "answerId": "left-2" },
{ "id": "right-3", "label": "Internal Server Error", "answerId": "left-3" }
],
"correctIds": [],
"required": true,
"only_correct": false,
"settings": { "balls": true, "balls_count": 1, "order": "not" }
}order — Указание порядка
Респондент расставляет элементы в правильном порядке. Порядок элементов в массиве answers — это правильный порядок.
answers— элементы в правильном порядке. При отображении перемешиваются (еслиsettings.order="random").correctIds— обычно пустой, правильный порядок определяется позицией в массиве.
json{
"id": "q12",
"type": "order",
"title": "Расположите этапы разработки в правильном порядке",
"answers": [
{ "id": "s1", "label": "Анализ требований" },
{ "id": "s2", "label": "Проектирование" },
{ "id": "s3", "label": "Разработка" },
{ "id": "s4", "label": "Тестирование" },
{ "id": "s5", "label": "Развёртывание" }
],
"criterions": [],
"correctIds": [],
"required": true,
"only_correct": false,
"settings": { "balls": true, "balls_count": 1, "order": "random" }
}filling_gaps — Заполнение пропусков
Составной вопрос: текст с вставленными полями ввода и выпадающими списками. Массив answers содержит фрагменты трёх типов:
| Тип фрагмента | Описание |
|---|---|
text | Статический текст |
input | Поле ввода с вариантами (options) |
select | Выпадающий список с вариантами (options) |
answers[].type— тип фрагмента:"text","input"или"select".answers[].label— текст для фрагментов типа"text".answers[].options— массив вариантов для"input"и"select"({ id, label }).correctIds— массивidправильных вариантов изoptionsполейinputиselect.
json{
"id": "q13",
"type": "filling_gaps",
"title": "Заполните пропуски в определении",
"answers": [
{ "id": "f1", "type": "text", "label": "HTML расшифровывается как " },
{
"id": "f2",
"type": "select",
"options": [
{ "id": "opt-1", "label": "HyperText Markup Language" },
{ "id": "opt-2", "label": "HighText Machine Language" },
{ "id": "opt-3", "label": "HyperTool Multi Language" }
]
},
{ "id": "f3", "type": "text", "label": ". Файлы имеют расширение " },
{
"id": "f4",
"type": "input",
"options": [
{ "id": "opt-4", "label": ".html" }
]
}
],
"correctIds": ["opt-1", "opt-4"],
"criterions": [],
"required": true,
"only_correct": false,
"settings": { "balls": true, "balls_count": 1 }
}file — Загрузка файлов
Поле для загрузки файла респондентом. Без проверки правильного ответа.
json{
"id": "q14",
"type": "file",
"title": "Загрузите скриншот выполненного задания",
"answers": [],
"correctIds": [],
"criterions": [],
"required": true,
"only_correct": false,
"settings": { "balls": false, "order": "not", "balls_count": 1 }
}section — Раздел (этап)
Разделитель, который делит форму на логические этапы (страницы). Не является вопросом — используется для структурирования формы.
enabledTitle— отображать ли заголовок раздела.enabledDescription— отображать ли описание раздела.banner— URL баннера раздела.settings.order— порядок вопросов внутри раздела:"not"— по порядку,"random"— случайный.
Первый элемент массива
questionsвсегда является разделом — это корневой этап формы. Каждый последующий элементsectionначинает новый этап.
json{
"id": "sec-1",
"type": "section",
"title": "Теоретическая часть",
"answers": [],
"criterions": [],
"required": true,
"only_correct": true,
"settings": { "order": "not" },
"description": "Ответьте на вопросы по теории",
"enabledTitle": true,
"enabledDescription": true
}Готовый пример для импорта
Полный пример JSON-формы, готовый для импорта через функцию «Импорт формы»:
json{
"title": "Тестирование по основам веб-разработки",
"description": "Демонстрационная форма с различными типами вопросов",
"settings": {
"main": {
"requiredQuestionsByDefault": true,
"disableCopy": false,
"showAnswers": true,
"showCorrectAnswers": true,
"isUserAuth": 0,
"acceptUntil": 0,
"attemptsAllowed": 1
},
"mark": {
"type": 2,
"system": 5,
"marks": [
{ "mark": "5", "ball": 85, "name": "Отлично" },
{ "mark": "4", "ball": 70, "name": "Хорошо" },
{ "mark": "3", "ball": 50, "name": "Удовлетворительно" },
{ "mark": "2", "ball": 0, "name": "Неудовлетворительно" }
]
},
"other": {
"isViewValidQuestion": true,
"isViewFinalResult": false,
"enabledRealTimeAcceptUntill": false,
"durationRealTimeAcceptUntill": 60000
},
"customization": {
"theme": "lime"
}
},
"questions": [
{
"id": "sec-1",
"type": "section",
"title": "Основы HTML и CSS",
"answers": [],
"criterions": [],
"required": true,
"only_correct": true,
"settings": { "order": "not" },
"description": "Вопросы по базовым технологиям фронтенда",
"enabledTitle": true,
"enabledDescription": true
},
{
"id": "q-1",
"type": "option",
"title": "Какой тег используется для создания гиперссылки в HTML?",
"answers": [
{ "id": "a1", "label": "<a>" },
{ "id": "a2", "label": "<link>" },
{ "id": "a3", "label": "<href>" },
{ "id": "a4", "label": "<url>" }
],
"correctIds": ["a1"],
"criterions": [],
"required": true,
"only_correct": true,
"settings": { "balls": true, "balls_count": 1, "order": "not" }
},
{
"id": "q-2",
"type": "options",
"title": "Выберите валидные CSS-свойства",
"answers": [
{ "id": "b1", "label": "color" },
{ "id": "b2", "label": "font-size" },
{ "id": "b3", "label": "text-bold" },
{ "id": "b4", "label": "margin" },
{ "id": "b5", "label": "box-color" }
],
"correctIds": ["b1", "b2", "b4"],
"criterions": [],
"required": true,
"only_correct": true,
"settings": { "balls": true, "balls_count": 2, "order": "random" }
},
{
"id": "q-3",
"type": "input_text",
"title": "Какое CSS-свойство задаёт цвет текста?",
"answers": [
{ "id": "c1", "label": "color" }
],
"correctIds": ["c1"],
"criterions": [],
"required": true,
"only_correct": true,
"settings": { "balls": true, "balls_count": 1, "order": "not" },
"help": { "value": "Подсказка: это английское слово", "ball": 1 }
},
{
"id": "sec-2",
"type": "section",
"title": "Практическая часть",
"answers": [],
"criterions": [],
"required": true,
"only_correct": true,
"settings": { "order": "not" },
"enabledTitle": true,
"enabledDescription": false
},
{
"id": "q-4",
"type": "comparison",
"title": "Сопоставьте HTML-теги с их назначением",
"answers": [
{ "id": "d1", "label": "<p>" },
{ "id": "d2", "label": "<h1>" },
{ "id": "d3", "label": "<img>" }
],
"criterions": [
{ "id": "e1", "label": "Параграф", "answerId": "d1" },
{ "id": "e2", "label": "Заголовок", "answerId": "d2" },
{ "id": "e3", "label": "Изображение", "answerId": "d3" }
],
"correctIds": [],
"required": true,
"only_correct": false,
"settings": { "balls": true, "balls_count": 1, "order": "not" }
},
{
"id": "q-5",
"type": "order",
"title": "Расположите теги в порядке вложенности HTML-документа",
"answers": [
{ "id": "f1", "label": "<!DOCTYPE html>" },
{ "id": "f2", "label": "<html>" },
{ "id": "f3", "label": "<head>" },
{ "id": "f4", "label": "<body>" }
],
"criterions": [],
"correctIds": [],
"required": true,
"only_correct": false,
"settings": { "balls": true, "balls_count": 1, "order": "random" }
}
]
}