如何对JSON进行操作:从基础到实践的全面指南
在当今数据驱动的开发世界中,JSON(JavaScript Object Notation)已成为轻量级数据交换的事实标准,无论是Web前后的数据交互、API接口返回,还是配置文件存储,JSON都凭借其简洁、易读和机器可解析的特性被广泛应用,JSON的操作方法,是每一位开发者的必备技能,本文将从JSON的基础概念出发,系统介绍如何在不同场景下解析、生成、查询和修改JSON数据,并结合代码示例帮助你快速上手。
JSON是什么?核心特点与语法规则
在操作JSON之前,我们先明确其定义和语法规范,JSON是一种基于文本的数据格式,起源于JavaScript,但如今已与语言无关,被大多数编程语言支持,其核心特点包括:
- 轻量级:相比XML,JSON更简洁,解析和生成速度更快。
- 易读性:采用键值对(Key-Value)结构,格式清晰,人类可直接阅读。
- 数据类型支持:支持字符串、数字、布尔值、null、数组(有序值列表)和对象(无序键值对集合)六种基本数据类型。
语法规则示例
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "英语"],
"address": {
"city": "北京",
"district": "海淀区"
},
"nullValue": null
}
- 对象用 包裹,键值对用 分隔,多个键值对用 分隔;
- 数组用
[]包裹,元素用 分隔; - 键必须为字符串(双引号包裹),值可为上述六种数据类型。
JSON操作的核心场景:解析与生成
JSON操作的核心分为两类:将JSON字符串解析为程序内部对象(反序列化)和将程序内部对象转换为JSON字符串(序列化),不同编程语言提供了不同的实现方式,以下是主流语言的示例。
JSON字符串解析为对象(反序列化)
假设我们有以下JSON字符串:
const jsonString = '{"name": "李四", "age": 30, "hobbies": ["reading", "coding"]}';
(1)JavaScript/TypeScript
JavaScript原生提供 JSON.parse() 方法:
const obj = JSON.parse(jsonString); console.log(obj.name); // 输出: 李四 console.log(obj.hobbies[0]); // 输出: reading
注意事项:若JSON字符串格式错误(如单引号、尾随逗号),JSON.parse() 会抛出 SyntaxError,需配合 try-catch 使用:
try {
const obj = JSON.parse(jsonString);
} catch (error) {
console.error("JSON解析失败:", error);
}
(2)Python
Python使用 json 模块,json.loads()(load string)实现解析:
import json
json_string = '{"name": "李四", "age": 30, "hobbies": ["reading", "coding"]}'
obj = json.loads(json_string)
print(obj["name"]) # 输出: 李四
print(obj["hobbies"][0]) # 输出: reading
注意事项:Python中解析后的对象是字典(dict)或列表(list),JSON的布尔值 true/false 会被转为Python的 True/False(首字母大写)。
(3)Java
Java可通过 org.json 库或Jackson/Gson等第三方库实现,以 org.json 为例:
import org.json.JSONObject;
String jsonString = "{\"name\": \"李四\", \"age\": 30, \"hobbies\": [\"reading\", \"coding\"]}";
JSONObject obj = new JSONObject(jsonString);
System.out.println(obj.getString("name")); // 输出: 李四
System.out.println(obj.getJSONArray("hobbies").getString(0)); // 输出: reading
对象转换为JSON字符串(序列化)
假设我们有以下JavaScript对象/Python字典:
const jsObj = { name: "王五", age: 28, hobbies: ["traveling"] };
(1)JavaScript/TypeScript
使用 JSON.stringify() 方法:
const jsonString = JSON.stringify(jsObj);
console.log(jsonString); // 输出: {"name":"王五","age":28,"hobbies":["traveling"]}
进阶用法:JSON.stringify() 支持第二个参数 replacer(过滤/转换数据)和第三个参数 space(格式化输出):
// 过滤掉age属性,格式化输出(缩进2空格)
const filteredJson = JSON.stringify(jsObj, (key, value) => key !== "age" ? value : undefined, 2);
console.log(filteredJson);
/* 输出:
{
"name": "王五",
"hobbies": [
"traveling"
]
}
*/
(2)Python
使用 json 模块的 json.dumps()(dump string):
import json
python_dict = {"name": "王五", "age": 28, "hobbies": ["traveling"]}
json_string = json.dumps(python_dict, ensure_ascii=False, indent=2) # ensure_ascii支持中文,indent格式化
print(json_string)
/* 输出:
{
"name": "王五",
"age": 28,
"hobbies": [
"traveling"
]
}
*/
(3)Java
以 org.json 为例,使用 JSONObject.toString() 或Gson的 new Gson().toJson():
import org.json.JSONObject;
Map<String, Object> javaMap = new HashMap<>();
javaMap.put("name", "王五");
javaMap.put("age", 28);
javaMap.put("hobbies", Arrays.asList("traveling"));
JSONObject obj = new JSONObject(javaMap);
String jsonString = obj.toString();
System.out.println(jsonString); // 输出: {"name":"王五","age":28,"hobbies":["traveling"]}
JSON数据的查询与修改
解析JSON后,核心操作是对数据的查询和修改,JSON本质是树形结构,可通过路径定位节点,再进行增删改查。
查询数据:按路径获取值
(1)基础查询:键/索引访问
- 对象通过键访问:
obj.key或obj["key"]; - 数组通过索引访问:
arr[0]。
示例(JavaScript):
const data = {
user: {
name: "赵六",
contacts: {
email: "zhaoliu@example.com",
phones: ["13800138000", "13900139000"]
}
}
};
console.log(data.user.name); // 输出: 赵六
console.log(data.user.contacts.phones[1]); // 输出: 13900139000
(2)复杂查询:使用路径库
若JSON结构嵌套较深,手动多层访问易出错,可借助路径库简化操作。
JavaScript示例(使用 jsonpath 库):
// 安装: npm install jsonpath
const jsonpath = require("jsonpath");
const data = { /* 同上 */ };
const emails = jsonpath.query(data, "$..email"); // 查询所有email节点
console.log(emails); // 输出: ["zhaoliu@example.com"]
const firstPhone = jsonpath.query(data, "$..phones[0]"); // 查询所有phones数组的第一个元素
console.log(firstPhone); // 输出: ["13800138000"]
Python示例(使用 jsonpath-ng 库):
# 安装: pip install jsonpath-ng
from jsonpath_ng import jsonpath, parse
data = { /* 同上Python字典格式 */ }
email_expr = parse('$.user.contacts.email')
email = email_expr.find(data)[0].value
print(email) # 输出: zhaoliu@example.com
修改数据:更新/添加/删除节点
(1)直接赋值修改
通过路径定位节点后,直接重新赋值即可,示例(JavaScript):
const data = { user: { name: "赵六", age: 40 } };
data.user.age = 41; // 修改已有值
data.user.gender = "男"; // 添加新键值对
console.log(data);
// 输出: { user: { name: "赵六", age: 41, gender: "男" } }
(2)删除节点
- JavaScript:使用
delete操作符或Array.prototype.splice()(删除数组元素); - Python:使用
del语句或pop()方法。



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