Как преобразовать FormData в JSON без jQuery
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы преобразовать FormData
в JSON
, вы можете воспользоваться следующим кодом:
const formDataToJson = (formData) => JSON.stringify(Object.fromEntries(formData));
const formElement = document.querySelector('form');
const jsonData = formDataToJson(new FormData(formElement));
На месте formElement
укажите ваш элемент формы в DOM, тогда переменная jsonData
будет содержать JSON-строку.
Разбор быстрого решения
Функция Object.fromEntries()
преобразует список пар ключ-значение в объект. В паре с FormData
это позволяет конвертировать данные формы в обыкновенный объект, который затем JSON.stringify
приводит к виду строки JSON.
Обработка нескольких значений
Если кто-то из полей формы возвращает множественные значения, например, при использовании мультиселекта, обращайтесь с ними так:
const formDataToJson = (formData) => {
const object = {};
formData.forEach((value, key) => {
if (!object.hasOwnProperty(key)) {
object[key] = value;
} else {
if (!Array.isArray(object[key])) {
object[key] = [object[key]];
}
object[key].push(value);
}
});
return JSON.stringify(object);
};
Тут мы проверяем, наличие ключа в объекте, и если он уже присутствует, то преобразуем прикреплённые значения в массив.
Визуализация
Представьте, что преобразование FormData в JSON -- это ни что иное, как аккуратно выполненная перепаковка данных:
FormData (🛄): | field1 👕 | field2 🧦 | field3 👖 |
Теперь эти данные нужно упаковать в контейнер JSON для их отправки по просторам интернета:
const formData = new FormData();
formData.append('field1', 'Value1');
formData.append('field2', ['ValueA', 'ValueB']);
formData.append('field3', 'ValueX');
Процесс перепаковки можно представить так:
🛄 => 📦 {"field1": "Value1", "field2": ["ValueA", "ValueB"], "field3": "ValueX"}
Таким образом, данные переложены в контейнер JSON, готовый к отгрузке:
Контейнер JSON (📦): {"field1": "Value1", "field2": ["ValueA", "ValueB"], "field3": "ValueX"}
Пара ключ-значение — это некий предмет, аккуратно упакованный для отправки в виртуальном мире.
Отправка на сервер
Если вам приходится отправлять JSON на сервер, используйте Fetch API:
fetch('https://example.com/submit', {
method: 'POST',
body: jsonData,
headers: {
'Content-Type': 'application/json'
}
});
Не забывайте устанавливать заголовок Content-Type
с значением 'application/json', чтобы сервер был в курсе, в каком формате предстоит принять данные.
Сериализация сложных объектов
Для сериализации более сложных объектов нужно подходить индивидуально. Вы можете определить метод toJSON()
, который поможет произвести корректное преобразование объекта в строку JSON с помощью JSON.stringify
:
class CustomObject {
constructor(prop1, prop2) {
this.prop1 = prop1;
this.prop2 = prop2;
}
toJSON() {
return {
compositeProperty: `${this.prop1}_${this.prop2}`
};
}
}
const customObj = new CustomObject('Топливо', 'Искра');
const jsonData = JSON.stringify(customObj);
Метод toJSON()
позволяет вам управлять тем, как ваши объекты будут представлены в формате JSON.
Полезные материалы
- FormData – Web API | MDN — подробная информация о FormData на MDN.
- Преобразование FormData (HTML5 объекта) в JSON – Stack Overflow — отобранные сообществом решения по преобразованию FormData в JSON.
- FormData – JavaScript.info — понятные объяснения и примеры использования FormData.
- Преобразование JS-объектов в FormData для сложных структур — Gist на GitHub, помогающий преобразовать сложные объекты в FormData.
- .serializeArray() – jQuery — метод jQuery для преобразования значений формы в JSON.
- Применение метода FormData.append() — руководство MDN за методом append и связанными с ним вопросами.
- Использование FormData для AJAX-загрузки файлов — обзор использования FormData для загрузки файлов с помощью AJAX.