Skip to main content

Що робить метод toJSON()?

toJSON() - це спеціальний метод, який JavaScript викликає автоматично під час серіалізації об'єкта через JSON.stringify().

Він дозволяє контролювати, що саме потрапить у JSON-рядок.

Коротко

Якщо у об'єкта є метод toJSON(), то при виклику JSON.stringify(obj) замість самого об'єкта серіалізується результат виклику цього методу.

Приклад - базовий

javascript
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.

Як це працює "під капотом"

Коли ти викликаєш:

javascript
JSON.stringify(obj)

JavaScript робить наступне:

  1. Перевіряє: чи є у obj метод toJSON()? → якщо є - викликає його:
javascript
const value = obj.toJSON();
  1. Серіалізує результат виклику, а не сам об'єкт.

Приклад із вкладеними об'єктами

toJSON() працює рекурсивно для всіх вкладених об'єктів.

javascript
const user = { name: 'Alex', stats: { score: 42, toJSON() { return 'Top Secret'; // замінюємо об'єкт рядком } } }; console.log(JSON.stringify(user)); // '{"name":"Alex","stats":"Top Secret"}'

Метод toJSON() всередині stats був викликаний автоматично і підмінив вкладений об'єкт.

Приклад із класами

Можна використовувати toJSON() у своїх класах, щоб гарно серіалізувати екземпляри:

javascript
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.

javascript
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.

javascript
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()Так (працює лише на серіалізацію)

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.