JSON 数据格式:序列化、校验与 Schema
FreeGuideOnline
最新
2026-06-15
JSON 数据格式入门指南
什么是 JSON
JSON(JavaScript Object Notation)是一种轻量级、纯文本、语言无关的数据交换格式。它易于人类阅读和编写,也易于机器解析和生成。尽管最初源于 JavaScript,但当下几乎所有主流编程语言都提供了对 JSON 的完整支持,使其成为 Web API、配置文件、数据存储等场景中最常见的数据格式。
JSON 基础语法
JSON 建立在两种核心结构之上:
- 对象 —— 由花括号
{}包围的键值对集合。键必须是字符串,值可以是任意有效类型。 - 数组 —— 由方括号
[]包围的有序值列表。
支持的数据类型
| 类型 | 示例 | 说明 |
|---|---|---|
| 字符串 | "hello" |
必须使用双引号 |
| 数字 | 42, 3.14, -1, 1.5e10 |
十进制,不区分整数与浮点数,无无穷大 |
| 布尔值 | true, false |
仅小写 |
| null | null |
表示空值 |
| 对象 | {"key": "value"} |
无序键值对集合,键必须为字符串 |
| 数组 | [1, "text", null] |
有序值列表,元素类型可不同 |
语法规则
- 整个文档可以是一个对象、数组或任意单一值(标准 RFC 8259 允许顶层为任意值,但多数 API 约定顶层为对象或数组)。
- 字符串必须用双引号
"",不可用单引号。 - 对象键必须是双引号包围的字符串。
- 数组与对象的最后一个元素、键值对后不允许添加逗号(trailing comma)。
- 无注释结构(原生 JSON 不支持注释,但某些变体如 JSON5 或 VS Code settings 中允许)。
合法示例
{
"name": "Alice",
"age": 30,
"isStudent": false,
"languages": ["Python", "JavaScript"],
"address": {
"city": "Berlin",
"zip": "10115"
},
"scores": null
}
序列化与反序列化
“序列化”指将内存中的数据结构转换为 JSON 字符串的过程;“反序列化”则是将 JSON 字符串还原为数据结构。
以 JavaScript 为例(其他语言思路一致):
// 反序列化(解析 JSON 字符串)
const jsonString = '{"name":"Alice","age":30}';
const data = JSON.parse(jsonString);
console.log(data.name); // Alice
// 序列化(生成 JSON 字符串)
const obj = { name: "Bob", age: 25, hobbies: ["reading"] };
const json = JSON.stringify(obj, null, 2); // 第三个参数用于缩进
console.log(json);
常见注意事项
JSON.parse()遇到不合法的 JSON 会抛出异常,需要try/catch保护。- 序列化时,
undefined、函数、Symbol 会被自动移除或转换为null(不同语言实现有细微差异)。 - 日期对象通常会被转换为 ISO 字符串,需在反序列化后手动转换。
- 循环引用的对象无法序列化,会抛出错误。
JSON 校验
在接收或处理 JSON 数据时,快速校验格式是否合法是重要一步。
在线工具与命令行
- jsonlint.com —— 粘贴 JSON,立即获得错误定位。
- VS Code 等编辑器会自动高亮语法错误。
- 命令行工具
jq可以同时完成校验与格式化:
echo '{"key":"value"}' | jq .
若格式错误,jq会输出具体行号和错误原因。
编程式校验示例(JavaScript)
function isValidJSON(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
}
JSON Schema 入门
当数据格式通过校验后,往往还需要验证数据是否满足特定的结构、类型和约束。JSON Schema 正是为此而生的规范——它本身也是 JSON 对象,用来描述一份 JSON 数据应当长什么样。
编写第一个 Schema
假设我们期望的用户对象包含:id(整数,必填),name(字符串,必填),email(字符串、邮箱格式,必填),tags(字符串数组,可选)。
对应的 JSON Schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer" },
"name": { "type": "string" },
"email": { "type": "string", "format": "email" },
"tags": {
"type": "array",
"items": { "type": "string" }
}
},
"required": ["id", "name", "email"]
}
常见验证关键词
| 关键词 | 作用 |
|---|---|
type |
数据类型:"string", "number", "integer", "object", "array", "boolean", "null" |
properties |
定义对象的属性规则 |
required |
必须出现的属性数组 |
items |
数组每个元素的规则(若为单个 Schema) |
enum |
枚举值列表 |
minimum/maximum |
数值范围 |
minLength/maxLength |
字符串长度限制 |
pattern |
正则表达式字符串 |
format |
语义格式,如 "email", "date-time" |
additionalProperties |
是否允许未在 properties 中定义的属性 |
使用 JSON Schema 验证数据
可通过各种语言的验证库,例如 JavaScript 的 ajv:
const Ajv = require("ajv");
const ajv = new Ajv();
const validate = ajv.compile(schema);
const valid = validate(data);
if (!valid) console.log(validate.errors);
现代 API 文档工具(如 OpenAPI)广泛使用 JSON Schema 定义请求/响应结构,实现自动校验与代码生成。
常见错误与最佳实践
- 键缺少双引号:
{name: "Alice"}❌ →{"name": "Alice"}✅ - 末尾多余逗号:
{"a": 1,}❌ 或[1,2,]❌ - 使用注释:原生 JSON 不支持
//或/* */,需要去掉或使用支持注释的预处理器。 - 数值精度问题:JSON 中数字均为文本,大整数(如超过 2^53 的)可能在不同语言间丢失精度,建议传输时转为字符串。
- 顶层使用数组合法但不够稳健,若 API 返回顶层数组,缺少 “wrapper 对象” 会使得很难添加额外信息(如错误码、分页)。
- 序列化时保留类型:考虑 JSON 的局限性,前后端可约定特殊的键(如
"__type": "date")来辅助还原。
进阶阅读与工具链
- JSON5:增加了注释、单引号字符串、尾逗号等特性,适合配置文件。
- JSON Lines(
.jsonl):每行一个独立的 JSON 对象,适合日志和大数据场景。 - jq:命令行下的 JSON 处理利器,支持查询、转换、格式化。
- 快速校验服务:集成于 CI/CD 流水线中,对生成的 JSON 文件自动运行
jsonschema校验。
掌握 JSON 基础、序列化要点以及 Schema 校验方法,将帮助你构建更健壮、可维护的数据交换系统,无论是在 Web 开发、移动应用还是微服务架构中,这都是必备技能。