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 开发、移动应用还是微服务架构中,这都是必备技能。