← Назад к вопросам

Как оформить ложный объект в JSON

1.0 Junior🔥 121 комментариев
#Тестирование API

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отличный вопрос, который затрагивает важные аспекты проектирования API, безопасности и согласованности данных. Строго говоря, в спецификации JSON (JavaScript Object Notation) не существует понятия "ложного объекта" как отдельного типа данных. Это семантическая, а не синтаксическая концепция. Поэтому "оформить" его можно несколькими способами, в зависимости от контекста и цели.

Концепция "Ложного" или "Пустого" Объекта

Под "ложным объектом" обычно понимают одно из двух:

  1. Объект, указывающий на отсутствие значимых данных (аналог null, но в структуре объекта).
  2. Специальный объект-заглушка (stub или mock), используемый в тестировании или при частичной загрузке данных, который сигнализирует, что реальные данные не были загружены или не существуют.

Ключевое решение заключается в том, как клиентское приложение будет интерпретировать этот объект.

Основные Способы Реализации

1. Объект с Флагом или Специальным Полем

Наиболее явный и рекомендуемый способ. Мы добавляем поле, которое однозначно описывает состояние объекта.

{
  "user": {
    "isEmpty": true,
    "reason": "NOT_FOUND",
    "message": "Запрошенный пользователь не существует"
  }
}
{
  "data": null,
  "meta": {
    "isStub": true,
    "availableAt": "/api/v2/full-profile"
  }
}

Преимущества: Полная ясность, расширяемость, легко парсится на любой платформе.

2. Пустой Объект {}

Простейший вариант, но неоднозначный.

{
  "profile": {}
}

Недостатки: Нельзя отличить "объект пуст, потому что он ложный" от "объект пуст, потому что у него все поля не заполнены". Подходит только если такое состояние допустимо бизнес-логикой.

3. Объект с Минимальными или Дефолтными Полями

Часто используется в сочетании с флагом. Поля могут иметь значения по умолчанию или явные "пустые" метки.

{
  "product": {
    "id": 0,
    "name": "N/A",
    "isActive": false,
    "isRealData": false
  }
}

Внимание! Опасный способ, если id: 0 или name: "N/A" могут быть валидными данными в системе.

4. Использование null

Самый строгий с точки зрения JSON способ показать отсутствие объекта.

{
  "owner": null,
  "primaryAccount": null
}

Преимущества: Стандартно, не требует дополнительной логики для проверки полей. Недостатки: "Теряется" структура. Если в успешном ответе owner — это всегда объект с полями id и name, то null ломает эту контрактную договорённость. Клиентский код, ожидающий объект, может упасть с ошибкой.

Рекомендации и Лучшие Практики

При выборе стратегии я, как QA Lead, настаиваю на следующих принципах:

  • Консистентность API: Выберите один подход для всего API. Нельзя в одном эндпоинте возвращать null, в другом — {}, а в третьем — объект с флагом.
  • Документация: Способ обозначения ложного объекта должен быть явно описан в документации API (OpenAPI/Swagger). Например:
    > Поле `user` всегда является объектом. Если пользователь не найден, будет возвращён объект с полем `status: "phantom"` и заполненными только полями `id` и `errorMessage`.
  • Удобство для Клиента: Ориентируйтесь на то, как будет работать фронтенд. Явный флаг (isFake, isEmpty) проще всего обрабатывать в условиях.
  • Безопасность: Ложный объект не должен содержать чувствительных данных или полей, которые могут быть ошибочно приняты за валидные (например, password: "").
  • Тестирование: При тестировании API такие сценарии — обязательные к проверке. Нужно покрыть тестами:
    *   Ответ с ложным объектом.
    *   Корректность HTTP-статуса (часто это `200 OK`, но может быть `404 Not Found` или `207 Multi-Status`).
    *   Что клиентское приложение корректно обрабатывает эту ситуацию (показывает заглушку, не падает).

Пример для Тестирования (Mock-ответ)

В автотестах или при мокировании API часто используют объекты с явными маркерами.

// Пример мок-объекта для сервиса пользователя в тесте
const mockFalseUser = {
  isMock: true, // Явный флаг для разработчика и тестов
  id: -1,
  name: "[Stub User]",
  // Остальные поля могут отсутствовать или иметь пустые значения
  email: "",
  permissions: []
};

// Проверка в тесте (псевдокод)
it('should return stub object for deleted user', async () => {
  const response = await api.getUser(999999);
  expect(response.statusCode).toBe(200);
  expect(response.body.user).toHaveProperty('isMock', true);
  expect(response.body.user.name).toBe('[Stub User]');
});

Вывод

Наиболее правильным, надёжным и поддерживаемым способом я считаю использование объекта с явным булевым флагом (например, isPlaceholder, isEmpty) и, опционально, полем с причиной (reason). Этот подход:

  1. Сохраняет структурную целостность ответа (всегда объект).
  2. Делает намерение разработчика API кристально ясным.
  3. Позволяет гибко развивать контракт, добавляя новые мета-поля.
  4. Максимально удобен для написания стабильных и понятных автотестов и клиентского кода.
Как оформить ложный объект в JSON | PrepBro