JSON
JSON 是一种由对象、数组和值组成的文本格式,用于 API、标注和模型输出。内容涵盖语法规则、机器学习用途、JSON Lines 和代码。
JSON 是 JavaScript 对象表示法的简称,是一种轻量级的文本格式,用于存储和交换结构化数据。Douglas Crockford 在 2000 年代初对其进行了规范,基于 JavaScript 的对象字面量语法;如今,JSON 已被标准化为 IETF RFC 8259 和 ECMA-404。JSON 与编程语言无关、易于阅读,几乎所有编程语言的标准库都能解析它,因此它成为 Web API 的默认格式。在机器学习(ML)中,JSON 用于从推理引擎导出预测结果、存储数据集标注、记录实验元数据,以及定义大语言模型(LLMs)的结构化输出。
JSON 语法#
JSON 文档由两种容器和四种值构成:
- 对象:用花括号括起来的无序键值对集合,例如
{"name": "bus", "confidence": 0.94}。键必须是用双引号括起来的字符串。 - 数组:用方括号括起来的有序列表,例如
[48.5, 398.0, 245.3, 902.1]。 - 值:字符串、数字、字面量
true、false和null,或者嵌套对象和数组。
这种格式有严格要求。不允许使用注释、尾随逗号、单引号字符串以及值 NaN 和 Infinity;不过,除非设置了 allow_nan=False,否则 Python 的 json 模块默认会写入 NaN,生成严格解析器无法接受的文件。RFC 8259 还提醒,只有在 IEEE 754 双精度范围内,数字才能可靠地交换;因此,大于 2⁵³ − 1 的整数(例如某些数据库 ID)通常会以字符串形式发送。
机器学习工作流中的 JSON#
当安防系统中的摄像头将一帧画面发送到目标检测服务时,模型服务层通常会以 JSON 返回结果:每个检测到的对象对应一条记录,包含类别、置信度分数和边界框坐标,可直接用于仪表盘、移动应用和 MongoDB 等文档数据库。
标注格式也会用到 JSON。COCO 数据集会将一个数据划分的全部标签存储在同一个 JSON 文件中,其中包含三个主要列表:images存储文件名和尺寸,categories存储类别 ID 和名称,annotations中的每个条目通过 ID 指向图像和类别,并将边界框存储为像素坐标 [x, y, width, height],原点位于左上角。YOLO 格式则为每张图像使用一个文本文件,存储归一化后的中心坐标;在两种格式之间转换是数据标注流水线中的常见步骤,不过自定义数据集类也可以直接使用 COCO JSON 训练 YOLO。
JSON Lines(也称 NDJSON)会在每一行放置一个完整的 JSON 对象。这样,文件便可追加、流式处理和拆分,而无需解析整个文档,因此适用于训练日志、预测流,以及用于对 LLM 进行微调的指令数据集。对于 LLM,JSON Schema会描述应用所需的确切字段,而结构化输出和函数调用则会限制模型,使其生成符合该规范的 JSON。GeoJSON以 RFC 7946 为标准,将这种格式用于地理要素,从而让卫星图像分析能够将检测结果标注在地图上。
将预测结果转换为 JSON#
Ultralytics YOLO Results对象会使用 to_json() 序列化预测结果,为每个检测结果写入一条记录,其中包含类别名称、类别 ID、置信度和边界框角点 x1、y1、x2、y2;对于实例分割和姿态估计模型,还会包含掩码或关键点坐标。下面的示例会在一张示例图像上运行 YOLO26,并使用 Python 标准库解析 JSON:
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 对象,用于保存以像素为单位的角点坐标。










