JSON转换与解析:从入门到实践的全面指南
什么是JSON?为什么需要转换与解析?
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,以易于人类阅读和编写的文本形式存储和传输结构化数据,它基于JavaScript的一个子集,但已成为独立于语言的数据交换标准,广泛应用于Web前后端交互、API数据传输、配置文件存储等场景。
与XML、CSV等格式相比,JSON的优势在于:
- 简洁性:语法简单,冗余信息少;
- 易解析:可直接映射为编程语言中的对象、字典等数据结构;
- 跨语言支持:几乎所有主流编程语言都提供JSON解析库。
但在实际应用中,JSON常需要与编程语言内部的“原生数据结构”相互转换(如Python中的字典/列表、Java中的Map/List、JavaScript中的对象/数组),也需要从字符串形式解析为可操作的数据结构,或从数据结构序列化为字符串——这就是JSON的“转换”与“解析”核心需求。
JSON的基本语法:理解转换与解析的基础
JSON的语法规则简单,这些规则是后续转换与解析的前提:
数据类型
- 简单类型:字符串(需用双引号包裹,如
"name")、数字(如25、14)、布尔值(true/false)、null; - 复合类型:
- 对象(Object):无序键值对集合,键为字符串,值可为任意类型,如
{"name": "张三", "age": 30}; - 数组(Array):有序值列表,值可为任意类型,如
[1, "two", {"key": "value"}]。
- 对象(Object):无序键值对集合,键为字符串,值可为任意类型,如
语法规则
- 键值对之间用逗号分隔;
- 对象用花括号包裹,数组用方括号
[]包裹; - 字符串必须用双引号(单引号非法),数值不能省略小数点后的零(如
0不能简写为3)。
JSON的解析:将字符串转换为原生数据结构
“解析”是指将JSON格式的字符串(如'{"name": "李四", "age": 25}')转换为编程语言中可直接操作的数据结构(如Python的字典、JavaScript的对象),不同语言的解析方式略有差异,但核心逻辑一致。
JavaScript中的JSON解析
JavaScript作为JSON的起源语言,原生提供了JSON对象,支持解析与序列化。
(1)JSON.parse():字符串 → 对象/数组
const jsonString = '{"name": "王五", "age": 28, "hobbies": ["reading", "coding"]}';
// 解析为JavaScript对象
const obj = JSON.parse(jsonString);
console.log(obj.name); // 输出: 王五
console.log(obj.hobbies[0]); // 输出: reading
// 解析数组
const jsonArrayString = '[1, 2, {"a": 3}]';
const arr = JSON.parse(jsonArrayString);
console.log(arr[2].a); // 输出: 3
注意事项
- JSON字符串必须严格符合语法(如键必须用双引号),否则会抛出
SyntaxError; - 可传入第二个参数
reviver(函数),用于在解析过程中转换值,如:const str = '{"date": "2023-10-01"}'; const obj = JSON.parse(str, (key, value) => { if (key === "date") return new Date(value); // 将字符串转为Date对象 return value; }); console.log(obj.date); // 输出: 2023-10-01T00:00:00.000Z (Date对象)
Python中的JSON解析
Python通过内置json模块实现解析,核心函数是json.loads()(字符串解析)和json.load()(从文件流解析)。
(1)json.loads():字符串 → 字典/列表
import json
json_string = '{"name": "赵六", "age": 32, "is_student": false}'
# 解析为Python字典
data = json.loads(json_string)
print(data["name"]) # 输出: 赵六
print(data["is_student"]) # 输出: False
(2)json.load():文件流 → 字典/列表
# 假设有一个文件 data.json,内容为: {"city": "北京", "population": 21540000}
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data["city"]) # 输出: 北京
注意事项
- JSON中的
true/false会转为Python的True/False,null转为None; - 若字符串格式错误(如单引号、逗号缺失),会抛出
json.JSONDecodeError。
Java中的JSON解析
Java中常用的JSON解析库包括Gson(Google)、Jackson、Fastjson(阿里巴巴),这里以Jackson为例(需引入依赖:com.fasterxml.jackson.core:jackson-databind)。
(1)字符串转对象/Map
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonParseDemo {
public static void main(String[] args) throws Exception {
String jsonString = "{\"name\": \"钱七\", \"age\": 40}";
ObjectMapper mapper = new ObjectMapper();
// 解析为Map
Map<String, Object> map = mapper.readValue(jsonString, Map.class);
System.out.println(map.get("name")); // 输出: 钱七
// 解析为自定义对象(需先定义类)
User user = mapper.readValue(jsonString, User.class);
System.out.println(user.getAge()); // 输出: 40
}
}
class User {
private String name;
private int age;
// getter/setter省略
}
JSON的序列化:将原生数据结构转换为字符串
“序列化”是与解析相反的过程,指将编程语言中的原生数据结构(如Python字典、JavaScript对象)转换为JSON格式的字符串,以便存储或传输。
JavaScript中的JSON序列化
(1)JSON.stringify():对象/数组 → 字符串
const obj = { name: "孙八", age: 35, hobbies: ["travel", "music"] };
// 序列化为JSON字符串
const jsonString = JSON.stringify(obj);
console.log(jsonString); // 输出: {"name":"孙八","age":35,"hobbies":["travel","music"]}
// 格式化输出(缩进2个空格)
const formattedJson = JSON.stringify(obj, null, 2);
console.log(formattedJson);
/*
{
"name": "孙八",
"age": 35,
"hobbies": [
"travel",
"music"
]
}
*/
(2)replacer参数:过滤或转换值
const data = { name: "周九", password: "123456", age: 28 };
// 过滤掉password字段
const filteredJson = JSON.stringify(data, (key, value) => {
if (key === "password") return undefined; // 不包含在结果中
return value;
});
console.log(filteredJson); // 输出: {"name":"周九","age":28}
Python中的JSON序列化
Python的json模块提供json.dumps()(字符串序列化)和json.dump()(写入文件)。
(1)json.dumps():字典/列表 → 字符串
import json
data = {"name": "吴十", "age": 45, "is_teacher": True}
# 序列化为JSON字符串
json_str = json.dumps(data)
print(json_str) # 输出: {"name": "吴十", "age": 45, "is_teacher": true}
# 格式化输出(ensure_ascii=False支持中文)
formatted_json = json.dumps(data, ensure_ascii=False, indent=2)
print(formatted_json)
"""
{
"name": "吴十",
"age": 45,
"is_teacher": true
}
"""
(2)json.dump():写入文件
data = {"city": "上海", "districts": ["黄浦", "静安", "浦东"]}
with open("city.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
/*
{
"city": "上海",
"districts": [
"黄浦",
"静安",


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