JSON
JSON — текстовый формат объектов, массивов и значений, используемый в API, аннотациях и выходных данных моделей. Правила синтаксиса, применение в ML, JSON Lines и код.
JSON — сокращение от JavaScript Object Notation («нотация объектов JavaScript»), облегчённый текстовый формат для хранения и обмена структурированными данными. Дуглас Крокфорд описал его в начале 2000-х, взяв за основу синтаксис литералов объектов JavaScript; сейчас формат стандартизирован в IETF RFC 8259 и ECMA-404. JSON не зависит от языка программирования, удобен для чтения и разбирается стандартными библиотеками почти всех языков, поэтому стал форматом по умолчанию для веб-API. В машинном обучении (ML) JSON передаёт результаты из движков инференса, хранит аннотации датасетов и метаданные экспериментов, а также задаёт структуру ответов больших языковых моделей (LLMs).
Синтаксис JSON#
Документ JSON состоит из двух контейнеров и четырёх типов значений:
- Объекты: Неупорядоченные наборы пар «ключ — значение» в фигурных скобках, например
{"name": "bus", "confidence": 0.94}. Ключи должны быть строками в двойных кавычках. - Массивы: Упорядоченные списки в квадратных скобках, например
[48.5, 398.0, 245.3, 902.1]. - Значения: Строки, числа, литералы
true,falseиnull, а также вложенные объекты и массивы.
Формат строгий. Комментарии, завершающие запятые, строки в одинарных кавычках и значения NaN и Infinity не допускаются, хотя модуль Python json по умолчанию записывает NaN, если не задан allow_nan=False, создавая файлы, которые отклоняют строгие парсеры. В RFC 8259 также отмечено, что числа надёжно передаются только в диапазоне точности чисел с плавающей запятой двойной точности IEEE 754, поэтому целые числа больше 2⁵³ − 1, например некоторые идентификаторы баз данных, часто передаются в виде строк.
JSON в рабочих процессах машинного обучения#
Когда камера в системе безопасности отправляет кадр в сервис обнаружения объектов, уровень обслуживания моделей обычно отвечает в формате JSON: по одной записи на обнаруженный объект с его классом, оценкой уверенности и координатами ограничивающего прямоугольника. Эти данные можно сразу использовать в панелях мониторинга, мобильных приложениях и документоориентированных базах данных, например MongoDB.
Форматы аннотаций тоже используют JSON. В наборе данных COCO все метки одного раздела хранятся в одном JSON-файле с тремя основными списками: images содержит имена и размеры файлов, categories — идентификаторы и имена классов, а annotations — записи, каждая из которых указывает изображение и категорию по идентификатору и хранит рамку как [x, y, width, height] в пикселях от верхнего левого угла. Формат YOLO, напротив, использует один текстовый файл на изображение с нормализованными координатами центра. Преобразование между этими форматами — обычный этап конвейеров разметки данных, хотя пользовательский класс набора данных также может обучать YOLO напрямую на JSON COCO.
В JSON Lines, также известном как NDJSON, на каждой строке записан целый объект JSON. Такие файлы можно дополнять, передавать потоком и разбивать на части без разбора всего документа, что удобно для журналов обучения, потоков предсказаний и наборов инструкций, используемых для дообучения LLM. Для LLM JSON Schema описывает точные поля, ожидаемые приложением, а структурированные выходные данные и вызов функций ограничивают модель формированием соответствующего JSON. GeoJSON, стандартизированный в RFC 7946, применяет этот формат к географическим объектам, благодаря чему результаты анализа спутниковых снимков можно размещать на карте.
Преобразование предсказаний в JSON#
Объекты Results Ultralytics YOLO сериализуют предсказания с помощью to_json(), записывая по одной записи на обнаружение с именем класса, идентификатором класса, уверенностью и координатами углов рамки x1, y1, x2, y2, а также координатами маски или ключевых точек для моделей сегментации экземпляров и оценки позы. В следующем примере YOLO26 запускается на тестовом изображении, после чего JSON разбирается стандартной библиотекой Python:
import json
from ultralytics import YOLO
# Загрузи предварительно обученную модель обнаружения YOLO26 и запусти инференс
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# Сериализуй каждое обнаружение в строку JSON (normalize=True масштабирует рамки в диапазон 0–1)
json_string = result.to_json()
# Любой парсер JSON сможет прочитать данные обратно, например в список словарей Python
detections = json.loads(json_string)
print(json.dumps(detections[0], indent=2))Выведенная запись — это объект JSON с ключами name, class и confidence, а также вложенным объектом box, содержащим координаты углов в пикселях.
JSON и связанные форматы#
- YAML: Более удобный для чтения формат с комментариями и вложенностью, задаваемой отступами; часто используется для конфигураций обучения и описаний датасетов. YAML 1.2 задуман как надмножество JSON, поэтому большинство документов JSON являются допустимыми документами YAML.
- XML: Формат на основе тегов, используемый для аннотаций Pascal VOC. Он многословнее JSON и поддерживает атрибуты, пространства имён и схемы.
- CSV: Плоский табличный формат, компактный для табличных данных, но не поддерживающий вложенные объекты и списки.
- Бинарные форматы: Protocol Buffers и MessagePack компактнее JSON и быстрее разбираются, но не предназначены для чтения человеком. Файлы моделей ONNX хранятся в виде сообщений Protocol Buffers.










