Що робить метод toJSON()?
toJSON() - це спеціальний метод, який JavaScript викликає автоматично
під час серіалізації об'єкта через JSON.stringify().
Він дозволяє контролювати, що саме потрапить у JSON-рядок.
Коротко
Якщо у об'єкта є метод toJSON(),
то при виклику JSON.stringify(obj)
замість самого об'єкта серіалізується результат виклику цього методу.
Приклад - базовий
const user = {
name: 'Alex',
age: 25,
password: 'secret',
toJSON() {
// обираємо, що потрапить у JSON
return { name: this.name, age: this.age };
}
};
console.log(JSON.stringify(user));
// '{"name":"Alex","age":25}'password не потрапив у JSON,
тому що toJSON() повертає лише name та age.
Як це працює "під капотом"
Коли ти викликаєш:
JSON.stringify(obj)JavaScript робить наступне:
- Перевіряє: чи є у
objметодtoJSON()? → якщо є - викликає його:
const value = obj.toJSON();- Серіалізує результат виклику, а не сам об'єкт.
Приклад із вкладеними об'єктами
toJSON() працює рекурсивно для всіх вкладених об'єктів.
const user = {
name: 'Alex',
stats: {
score: 42,
toJSON() {
return 'Top Secret'; // замінюємо об'єкт рядком
}
}
};
console.log(JSON.stringify(user));
// '{"name":"Alex","stats":"Top Secret"}'Метод toJSON() всередині stats був викликаний автоматично
і підмінив вкладений об'єкт.
Приклад із класами
Можна використовувати toJSON() у своїх класах,
щоб гарно серіалізувати екземпляри:
class User {
constructor(name, age) {
this.name = name;
this.age = age;
}
toJSON() {
return {
user: this.name,
age: this.age
};
}
}
const alex = new User('Alex', 25);
console.log(JSON.stringify(alex));
// '{"user":"Alex","age":25}'Це зручно, щоб визначати "чисте" представлення даних, наприклад, при відправці на сервер.
Приклад: вбудовані типи теж мають toJSON()
| Тип | Що робить toJSON() | Приклад |
|---|---|---|
Date | Повертає ISO-рядок | new Date().toJSON() → "2025-10-14T17:00:00.000Z" |
Map / Set | Не серіалізуються (типово) | JSON.stringify(new Map()) → {} |
BigInt | Не підтримується | Помилка: TypeError: Do not know how to serialize a BigInt |
Приклад, якщо toJSON() повертає не об'єкт
Можна повернути будь-яке значення - рядок, число, навіть null.
const product = {
name: 'T-shirt',
price: 1500,
toJSON() {
return `${this.name}: ${this.price}$`;
}
};
console.log(JSON.stringify(product));
// "\"T-shirt: 1500$\""Повернутий рядок стає результатом серіалізації.
Взаємодія з replacer
Якщо у об'єкта є і toJSON(), і replacer,
то спочатку викликається toJSON(),
а потім результат передається у replacer.
const obj = {
name: 'Alex',
toJSON() {
return { custom: true };
}
};
console.log(JSON.stringify(obj, (key, value) => {
if (key === 'custom') return 'done';
return value;
}));
// '{"custom":"done"}'ІТОГ
| Що робить | Визначає, що буде серіалізовано у JSON.stringify() |
|---|---|
| Де викликається | Автоматично при JSON.stringify() |
| Що повертає | Будь-яке значення (об'єкт, рядок, число тощо) |
| Працює рекурсивно | Так (для вкладених об'єктів) |
| Можна використовувати у класах | Так |
Ігнорується при JSON.parse() | Так (працює лише на серіалізацію) |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.