JSON数据处理的完整指南:从解析到实战应用
JSON数据处理全攻略:从基础语法到实战应用,一篇搞定!
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、易读、易于机器解析和生成,已成为Web开发、移动应用开发、API接口等场景中的数据交互“通用语言”,无论是前端从后端获取数据,还是不同系统间的数据传输,JSON都扮演着核心角色,本文将从JSON的基础概念出发,详细讲解JSON数据的处理方法,包括解析、生成、校验及实战应用,助你从“小白”到“高手”。
JSON是什么?先搞懂基础语法
在处理JSON之前,首先要明确它的核心语法规则,JSON本质上是一种文本格式,用于表示结构化数据,其语法基于JavaScript对象字面量,但更简洁且独立于语言。
JSON的数据类型
JSON支持以下数据结构:
- 对象(Object):无序的键值对集合,用 包裹,键必须是字符串(需用双引号 包裹),值可以是任意JSON类型。
{"name": "张三", "age": 25, "isStudent": false} - 数组(Array):有序的值列表,用
[]包裹,值可以是任意JSON类型。["苹果", "香蕉", {"color": "红色"}] - 基本数据类型:
- 字符串(String):双引号包裹,如
"hello"。 - 数值(Number):整数或浮点数,如
123、14(不支持科学计数法如1e3)。 - 布尔值(Boolean):
true或false。 - 空值(Null):
null。
- 字符串(String):双引号包裹,如
语法规则需注意
- 键必须用双引号包裹,单引号会报错(如
{'name': '张三'}是非法的)。 - 值不能是函数、日期对象(需转为字符串表示)、
undefined等JavaScript特有类型。 - 数据结构可以嵌套,如对象中包含数组,数组中又嵌套对象。
如何处理JSON数据?分场景详解
JSON数据的处理核心在于“序列化”(将数据转为JSON字符串)和“反序列化”(将JSON字符串解析为编程语言中的数据结构),不同编程语言的处理方式略有差异,本文以Python和JavaScript为例(两者是JSON处理的主流语言),结合场景讲解。
场景1:从字符串解析JSON数据(反序列化)
当我们从API接口、文件或数据库中获取JSON数据时,通常以字符串形式存在,需要将其解析为编程语言中的对象/字典,才能进一步操作。
Python:使用 json 模块
Python内置 json 模块,通过 json.loads()(loads = load string)解析JSON字符串:
import json
json_str = '{"name": "李四", "hobbies": ["reading", "coding"], "address": null}'
data = json.loads(json_str) # 解析为字典和列表的组合
print(data["name"]) # 输出: 李四
print(data["hobbies"][0]) # 输出: reading
print(data["address"]) # 输出: None
注意:JSON中的 null 会被解析为Python的 None,true/false 解析为 True/False。
JavaScript:使用 JSON.parse()
JavaScript原生提供 JSON.parse() 方法,可直接将JSON字符串转为对象/数组:
const jsonStr = '{"name": "王五", "age": 30, "skills": ["JavaScript", "Python"]}';
const data = JSON.parse(jsonStr);
console.log(data.name); // 输出: 王五
console.log(data.skills[1]); // 输出: Python
坑点提醒:如果JSON字符串不符合语法(如单引号、逗号多余),JSON.parse() 会抛出 SyntaxError,需用 try-catch 捕获异常:
try {
const data = JSON.parse("{'name': 'error'}"); // 非法JSON(单引号)
} catch (err) {
console.error("JSON解析失败:", err.message); // 输出: JSON.parse: expected property name or '}' in JSON
}
场景2:将数据转为JSON字符串(序列化)
当我们需要将数据通过API发送、存储到文件或数据库时,需将其序列化为JSON字符串。
Python:使用 json.dumps()
Python的 json.dumps()(dumps = dump string)将字典/列表等转为JSON字符串:
import json
data = {
"name": "赵六",
"scores": [90, 85, 92],
"info": {"gender": "male", "is_active": True}
}
json_str = json.dumps(data, ensure_ascii=False, indent=2) # ensure_ascii支持中文,indent格式化
print(json_str)
输出结果(格式化后):
{
"name": "赵六",
"scores": [90, 85, 92],
"info": {
"gender": "male",
"is_active": true
}
}
参数说明:
ensure_ascii=False:默认为True,非ASCII字符(如中文)会转为\u转义,设为False可保留原字符。indent=2:指定缩进空格数,使JSON字符串更易读(调试时常用,生产环境可省略以减少体积)。
JavaScript:使用 JSON.stringify()
JavaScript的 JSON.stringify() 可将对象/数组转为JSON字符串:
const data = {
name: "钱七",
hobbies: ["travel", "photography"],
contact: {
email: "qianqi@example.com",
phone: null
}
};
// 基本序列化
const jsonStr = JSON.stringify(data);
console.log(jsonStr);
// 输出: {"name":"钱七","hobbies":["travel","photography"],"contact":{"email":"qianqi@example.com","phone":null}}
// 格式化输出(缩进2空格)
const formattedJson = JSON.stringify(data, null, 2);
console.log(formattedJson);
高级用法:JSON.stringify() 还支持第二个参数 replacer,用于过滤或转换数据,只保留特定字段:
const filteredJson = JSON.stringify(data, (key, value) => {
if (key === "contact") return undefined; // 过滤掉contact字段
return value;
});
console.log(filteredJson);
// 输出: {"name":"钱七","hobbies":["travel","photography"]}
场景3:处理JSON文件(读写操作)
实际开发中,JSON常用于配置文件、数据存储等场景,需从文件读取JSON或写入JSON到文件。
Python:读写JSON文件
-
读取JSON文件:
json.load()(从文件流读取,注意是load无s)import json with open("config.json", "r", encoding="utf-8") as f: config = json.load(f) # 直接解析为Python对象 print(config["database"]["host"]) -
写入JSON文件:
json.dump()(将对象写入文件流)data = {"app_name": "MyApp", "version": "1.0"} with open("config.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) # 写入文件并格式化
JavaScript:Node.js环境下读写JSON文件
Node.js中需使用 fs(文件系统)模块,结合 JSON.parse/stringify:
-
读取JSON文件(异步):
const fs = require("fs").promises; async function readJsonFile(filePath) { try { const data = await fs.readFile(filePath, "utf-8"); return JSON.parse(data); } catch (err) { console.error("读取文件失败:", err); } } readJsonFile("data.json").then(data => { console.log(data); }); -
写入JSON文件(异步):
const fs = require("fs").promises; async function writeJsonFile(filePath, data) { try { const jsonString = JSON.stringify(data, null, 2); await fs.writeFile(filePath, jsonString, "utf-8



还没有评论,来说两句吧...