JSON 快速上手指南

简介: JSON是一种轻量级数据交换格式,语法严格,键名需双引号、值类型有限,支持跨语言解析。本文详解其语法规则、与JS对象区别、序列化/解析方法(stringify/parse)、实战应用及常见避坑技巧,助你快速掌握JSON核心技能。

JSON 快速上手指南
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于 JavaScript 对象语法但独立于编程语言,具有易读、易解析、跨语言的特性,是前后端数据交互、配置文件、数据存储的首选格式。本文涵盖 JSON 核心语法、解析 / 序列化、实战示例及避坑指南,零基础也能快速掌握。
一、JSON 核心概念与语法规则

  1. 什么是 JSON?
    JSON 不是编程语言,而是文本格式:
    源于 JavaScript 对象语法,但可被所有主流语言(Python/Java/PHP/Go 等)解析和生成;
    核心作用:在不同系统间传递数据(如前端 ↔ 后端)、存储结构化数据;
    相比 XML 更简洁、解析速度更快。
  2. 严格语法规则(必须遵守,否则解析失败)
    JSON 语法极其严格,任何一点错误都会导致解析报错,核心规则:
    规则 说明 示例
    键名必须用双引号包裹 单引号 / 无引号均非法 ✅ "name": "张三" ❌ name: "张三" / 'name': "张三"
    值的类型有限制 仅支持:字符串(双引号)、数字、布尔值(true/false)、数组、对象、null ✅ "age": 20 / "isStudent": true ❌ "desc": undefined / "fn": function(){}"
    末尾不能有多余逗号 数组 / 对象最后一个元素后禁止加逗号 ✅ [1,2,3] ❌ [1,2,3,]
    禁止注释 标准 JSON 不支持 // 或 / / 注释(JSON5 扩展支持) ❌ "name": "张三", // 姓名
    根节点只能是对象 / 数组 不能直接是字符串 / 数字等基础类型 ✅ {"name":"张三"} / [1,2,3] ❌ "hello"
  3. 合法 / 非法 JSON 示例
    json
    // ✅ 合法 JSON(标准格式)
    {
    "id": 1,
    "name": "张三",
    "age": 20,
    "isStudent": true,
    "hobbies": ["编程", "阅读"],
    "address": {
    "city": "北京",
    "district": "朝阳区"
    },
    "score": null
    }

// ❌ 非法 JSON(常见错误)
{
name: "张三", // 键名无双引号
'age': 20, // 键名单引号
"hobbies": ["编程", "阅读"], // 末尾多余逗号
"desc": undefined, // 不支持undefined
"sayHi": function() {} // 不支持函数
}
二、JSON 与 JavaScript 对象的区别
很多人混淆 JSON 和 JS 对象,核心区别如下:
特性 JSON JavaScript 对象
键名 必须双引号包裹 可省略 / 单引号 / 双引号
值类型 仅支持字符串、数字、布尔、数组、对象、null 支持所有 JS 类型(undefined、函数、日期等)
注释 不支持 支持 //// /
末尾逗号 禁止 部分浏览器允许(非标准)
本质 字符串(文本) 内存中的对象(数据结构)
javascript
运行
// JS 对象(内存中的数据)
const user = {
name: "张三", // 键名无引号
age: 20,
sayHi: function() { console.log("Hi"); } // 支持函数
};

// JSON 字符串(文本格式,需双引号、无函数)
const userJson = '{"name":"张三","age":20}';
三、JSON 解析与序列化(核心操作)
JSON 最常用的两个操作:
序列化:将 JS 对象 → JSON 字符串(JSON.stringify());
解析:将 JSON 字符串 → JS 对象(JSON.parse())。

  1. 原生 JavaScript 处理 JSON
    (1)序列化:JSON.stringify ()
    javascript
    运行
    // 基础用法:对象 → JSON 字符串
    const user = {
    name: "张三",
    age: 20,
    hobbies: ["编程", "阅读"],
    isStudent: true,
    address: { city: "北京" },
    // 以下类型会被忽略/转换
    sayHi: function() {}, // 函数:忽略
    desc: undefined, // undefined:忽略
    birthday: new Date() // 日期:转为字符串
    };

const jsonStr = JSON.stringify(user);
console.log(jsonStr);
// 输出:{"name":"张三","age":20,"hobbies":["编程","阅读"],"isStudent":true,"address":{"city":"北京"},"birthday":"2025-12-30T08:00:00.000Z"}

// 进阶用法:带参数(格式化+过滤)
// 参数2:replacer(过滤/修改值),参数3:space(缩进空格)
const formattedJson = JSON.stringify(user, ["name", "age", "hobbies"], 2);
console.log(formattedJson);
// 输出(格式化后):
// {
// "name": "张三",
// "age": 20,
// "hobbies": [
// "编程",
// "阅读"
// ]
// }
(2)解析:JSON.parse ()
javascript
运行
// 基础用法:JSON 字符串 → JS 对象
const jsonStr = '{"name":"张三","age":20,"hobbies":["编程","阅读"]}';
const user = JSON.parse(jsonStr);
console.log(user.name); // 输出:张三
console.log(user.hobbies[0]); // 输出:编程

// 进阶用法:reviver(解析时修改值)
const jsonWithDate = '{"name":"张三","birthday":"2025-12-30T08:00:00.000Z"}';
const userWithDate = JSON.parse(jsonWithDate, (key, value) => {
// 将日期字符串转回 Date 对象
if (key === "birthday") return new Date(value);
return value;
});
console.log(userWithDate.birthday.getFullYear()); // 输出:2025

// 错误处理:解析非法 JSON 时捕获异常
try {
const invalidJson = '{"name":"张三",}'; // 末尾多余逗号
JSON.parse(invalidJson);
} catch (err) {
console.error("解析失败:", err.message); // 输出:Unexpected token } in JSON at position 12
}

  1. 其他语言处理 JSON(简要示例)
    JSON 跨语言特性使其成为数据交换的通用格式,以下是主流语言的处理方式:
    (1)Python 处理 JSON
    python
    运行
    import json

序列化:字典 → JSON 字符串

user = {
"name": "张三",
"age": 20
}
json_str = json.dumps(user, ensure_ascii=False, indent=2)
print(json_str)

解析:JSON 字符串 → 字典

json_str = '{"name":"张三","age":20}'
user = json.loads(json_str)
print(user["name"]) # 输出:张三
(2)Java 处理 JSON(FastJSON 示例)
java
运行
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

public class JsonDemo {
public static void main(String[] args) {
// 序列化:对象 → JSON 字符串
User user = new User("张三", 20);
String jsonStr = JSON.toJSONString(user);
System.out.println(jsonStr);

    // 解析:JSON 字符串 → 对象
    String json = "{\"name\":\"张三\",\"age\":20}";
    User userObj = JSON.parseObject(json, User.class);
    System.out.println(userObj.getName());
}

static class User {
    private String name;
    private int age;
    // 构造方法、getter/setter 省略
}

}
四、JSON 实战示例(直接复制使用)

  1. 场景 1:AJAX 前后端数据交互
    JSON 是前后端交互的标准格式,结合 Axios 示例:
    html
    预览
    <!DOCTYPE html>













  • 场景 2:本地存储(localStorage)
    localStorage 仅支持存储字符串,需将对象序列化为 JSON 字符串:
    html
    预览
    <!DOCTYPE html>













  • 场景 3:JSON 配置文件(前端 / 后端通用)
    JSON 是配置文件的首选格式(如 config.json):
    json
    // config.json
    {
    "api": {
    "baseUrl": "https://api.example.com",
    "timeout": 5000,
    "headers": {
    "Content-Type": "application/json"
    }
    },
    "theme": {
    "primaryColor": "#42b983",
    "fontSize": 16
    },
    "features": {
    "darkMode": true,
    "autoSave": false
    }
    }
    前端加载配置文件:
    javascript
    运行
    // 加载JSON配置(需通过AJAX/ES6 import)
    async function loadConfig() {
    const res = await fetch("./config.json");
    const config = await res.json(); // 自动解析为JS对象
    console.log("API基础地址:", config.api.baseUrl);
    console.log("主题色:", config.theme.primaryColor);
    }
    loadConfig();
    五、常见问题与避坑指南
  • 解析失败的常见原因
    错误原因 示例 解决方案
    键名无双引号 {name: "张三"} 给键名加双引号:{"name":"张三"}
    末尾多余逗号 [1,2,3,] / {"a":1,} 删除多余逗号
    使用单引号 {'name':'张三'} 替换为双引号:{"name":"张三"}
    包含不支持的类型 {"desc": undefined} 移除 undefined / 函数 / 日期(或手动转换)
    语法错误(如少括号) {"name":"张三" 检查语法完整性(可用 JSON 校验工具)
  • 序列化特殊值的处理
    特殊值 JSON.stringify () 处理结果 解决方案
    undefined / 函数 / Symbol 忽略(对象中)/ 转为 null(数组中) 序列化前手动过滤 / 转换
    Date 对象 转为 ISO 字符串 解析时用 reviver 转回 Date
    循环引用(如 a.b = a) 报错 过滤循环引用的属性
    javascript
    运行
    // 处理循环引用
    const obj = { a: 1 };
    obj.b = obj; // 循环引用
  • // 方案1:手动过滤
    const safeObj = JSON.parse(JSON.stringify(obj, (key, value) => {
    if (key === "b") return undefined; // 过滤循环引用属性
    return value;
    }));

    // 方案2:使用第三方库(如 json-stringify-safe)
    // npm install json-stringify-safe
    // const stringifySafe = require('json-stringify-safe');
    // console.log(stringifySafe(obj));

    1. 大 JSON 数据处理
      解析超大 JSON(如 100MB+)时,直接用 JSON.parse() 会阻塞主线程,解决方案:
      前端:使用流式解析库(如 @streamparser/json);
      后端(Node.js):使用 stream 模块分段解析。
    2. 跨语言兼容注意事项
      数字精度:JSON 不支持 BigInt,超大数字(如 16 位以上)会丢失精度,需转为字符串传输;
      编码:确保 JSON 字符串为 UTF-8 编码(跨语言通用);
      布尔值:严格区分 true/false(小写),避免 True/False(Python 易犯错误)。
      六、JSON 扩展:JSON5(兼容标准,更灵活)
      标准 JSON 语法严格,JSON5 是其超集,解决痛点:
      支持单行 / 多行注释;
      键名可省略引号;
      允许末尾逗号;
      支持单引号字符串;
      支持数字后缀(如 10_000)。
      示例(config.json5):
      json5
      // config.json5(支持注释)
      {
      api: "https://api.example.com", // 键名无引号
      timeout: 5_000, // 数字分隔符
      themes: ['light', 'dark'], // 单引号
      features: {
      autoSave: true,
      }, // 末尾逗号
      / 多行注释 /
      version: "1.0.0"
      }
      前端使用需引入 JSON5 库:
      html
      预览


      七、核心总结
      JSON 是文本格式,不是编程语言,核心用于数据交换;
      语法严格:双引号键名、无注释、无多余逗号、值类型有限;
      核心操作:JSON.stringify()(序列化)、JSON.parse()(解析);
      跨语言特性:所有主流语言均支持 JSON 解析 / 生成;
      避坑重点:解析失败先检查语法,序列化注意特殊值(undefined / 循环引用)。
      JSON 是前端 / 后端开发的必备技能,掌握其核心语法和处理方式,能高效解决数据交换、存储、配置等场景的问题。
    相关文章
    |
    13天前
    |
    数据采集 人工智能 安全
    |
    8天前
    |
    编解码 人工智能 自然语言处理
    ⚽阿里云百炼通义万相 2.6 视频生成玩法手册
    通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
    657 4
    |
    8天前
    |
    机器学习/深度学习 人工智能 前端开发
    构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
    随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
    350 164
    |
    7天前
    |
    机器学习/深度学习 自然语言处理 机器人
    阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
    畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
    359 155

    热门文章

    最新文章