Типы данных, null, даты и числа
↑ 1.4 JSON, XML и другие форматы · ← Предыдущая · → Следующая
Зачем это аналитику и PM
«Пусто», «ноль» и «поля нет» в отчёте расходятся, если в JSON это три разных факта. Дата без пояса и сумма в обычном числе так же тихо портят приёмку.
План темы
- строка, число, boolean, null
- пустая строка и отсутствие поля
- даты и часовые пояса (ISO 8601, UTC)
- деньги и точность
Объяснение
В JSON мало типов. Строка в двойных кавычках, число без кавычек, логические true и false, пустое null, а ещё объект и массив. Отдельного типа «дата» или «деньги» нет. Их изображают строкой или числом, и это надо договорить.
Как графы анкеты. «Не заполнено» — графа есть, в ней пусто. «Графу вычеркнули» — поля нет в тексте. «Написали ноль» — значение есть, и оно число 0. Для склада это три разных остатка: неизвестно, пустая подпись и нулевая полка.
Пустота
null значит «значения нет», поле при этом присутствует. Пустая строка "" значит «строка есть, в ней ноль символов». Отсутствующий ключ значит «поле не прислали». Ноль 0 и false — обычные значения, не пустота. В требованиях для каждого поля выбирают один смысл пустого. Нельзя писать «если пусто», не сказав, какой из трёх случаев имеется в виду. Приёмка тогда спорит о баге, которого нет.
Даты
Дату почти всегда кладут строкой. Удобная запись — ISO 8601: календарная дата, при необходимости время. 2026-10-04 — день без времени. 2026-10-04T10:15:00Z — момент в UTC: буква Z значит «всемирное время», без сдвига. 2026-10-04T13:15:00+03:00 — тот же вид момента со сдвигом. Без Z и без сдвига неясно, чьи это часы: сервера, пользователя или базы. Для срока оплаты и «сегодняшней» выборки пояс фиксируют в контракте.
Деньги
Сумма с копейками в виде JSON-числа опасна, если её читают как двоичную дробь: не каждая копейка имеет точную двоичную запись. Для денег выбирают одно из явных правил и пишут его в контракте. Целое в минимальных единицах, например копейки. Либо строка с десятичной записью "10.10". Валюта — отдельное поле, не символ внутри суммы. Округление «до копеек» тоже правило, его не оставляют на экран.
| Запись | Что это | Чего не говорить |
|---|---|---|
"10" | Строка | Что это уже число для суммы |
10 | Число | Что дробь сохранит копейки сама |
null | Поле есть, значения нет | Что это ноль |
"" | Пустая строка | Что поля не было |
| нет ключа | Поле не прислали | Что пришёл null |
Примеры
Схема одного заказа. Все значения вымышлены, текст является корректным JSON.
{
"id": "1042",
"qty": 2,
"comment": null,
"note": "",
"paidAt": "2026-10-04T10:15:00Z",
"amountMinor": 1010,
"currency": "RUB"
}comment прислали и он пуст по смыслу null. note — пустая строка, это другой факт. amountMinor — 1010 минимальных единиц, то есть 10 рублей 10 копеек, если единица — копейка. Это условие надо произнести, из имени поля оно только подразумевается.
Тот же день без поясного суффикса — уже хуже как контракт:
{"paidAt": "2026-10-04T10:15:00"}Такой текст законный JSON, но момент не однозначен.
Нюансы и подводные камни
trueбез кавычек — логическое."true"— строка из четырёх букв. Фильтр их не обязан считать равными.- Ведущие нули в JSON-числе не пишут. Код товара с нулями — строка, иначе разбор сломается или нули исчезнут.
- Большой целочисленный идентификатор, который не влезает в обычное целое языка, тоже часто оставляют строкой. Это вопрос к команде, не догадка по длине на глаз.
Практика
Для полей «комментарий», «сумма», «время оплаты» напишите тип, как выглядит пусто и в какой единице сумма.
Ожидаемый результат: у комментария выбран один вариант из null, пустой строки и отсутствия ключа. У суммы названы минимальные единицы или строка и код валюты. У времени есть пример ISO 8601 с Z или со сдвигом. Второй формат не добавлен «для удобства экрана» без пометки, что это уже другое поле.
Вопросы с ответами
Чем null отличается от пустой строки?
null— значения нет, ключ есть.""— строка нулевой длины. Для отчёта и для обязательности поля это разные правила. [!question]- Почему даты нет среди типов JSON?Стандарт даёт строки, числа, логические, null, объекты и массивы. День и время договариваются как строка. Без пояса или сдвига момент читается неоднозначно. [!question]- Как передать 10 рублей 10 копеек?
Либо целым
1010, если единица — копейка, либо строкой"10.10". Обычное дробное число без оговорки легко потерять на копейке. Валюта — соседнее поле.