JSON数据解析全指南:从基础到实践
什么是JSON?为什么需要解析它?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,以易于阅读和编写的文本形式存储和传输结构化数据,它基于JavaScript语法,但已成为跨语言、跨平台的数据交换标准(如Web API响应、配置文件、数据存储等)。
解析JSON,就是将JSON格式的字符串转换为程序可操作的数据结构(如Python中的字典/列表、JavaScript中的对象/数组),或反向操作(将数据结构转换为JSON字符串)。解析是“读懂”JSON数据的过程,无论是从服务器获取数据,还是读取本地配置文件,都离不开这一步。
JSON基础语法:解析前的“必修课”
要正确解析JSON,先要理解它的核心语法规则,JSON数据由两种基本结构组成:
键值对(对象)
用 包裹,键(key)必须是字符串(双引号包围),值(value)可以是字符串、数字、布尔值、数组、对象或null。
{ "name": "张三", "age": 25, "isStudent": false, "address": { "city": "北京", "district": "海淀区" } }
数组(列表)
用 []
包裹,元素可以是任意JSON数据类型(包括嵌套的对象或数组)。
[ {"id": 1, "product": "手机", "price": 3999}, {"id": 2, "product": "电脑", "price": 6999}, {"id": 3, "product": "平板", "price": 2599} ]
数据类型
- 简单类型:字符串(
"abc"
)、数字(123
、14
)、布尔值(true
/false
)、null
。 - 复合类型:对象()、数组(
[]
)。
注意:JSON中所有字符串必须用双引号()包围,不能用单引号;末尾不能有逗号(如{"name": "张三",}
是非法的)。
如何解析JSON?不同语言的实践方法
解析JSON的核心任务:字符串 ↔ 数据结构,主流编程语言都内置了JSON处理库,下面以Python、JavaScript、Java为例,详解解析步骤。
Python:用json
模块轻松转换
Python标准库json
提供了loads()
(字符串转对象)和dumps()
(对象转字符串)方法。
(1)JSON字符串 → Python对象
import json # JSON字符串(注意双引号) json_str = '{"name": "李四", "age": 30, "hobbies": ["阅读", "游泳"]}' # 解析为Python字典 data = json.loads(json_str) print(data["name"]) # 输出: 李四 print(data["hobbies"][0]) # 输出: 阅读
(2)Python对象 → JSON字符串
import json # Python字典 python_dict = {"name": "王五", "age": 28, "isMarried": False} # 转换为JSON字符串(ensure_ascii=False确保中文正常显示) json_str = json.dumps(python_dict, ensure_ascii=False, indent=2) print(json_str) # 输出(格式化后): # { # "name": "王五", # "age": 28, # "isMarried": false # }
(3)处理复杂嵌套数据
complex_json = ''' { "school": "XX大学", "students": [ {"id": 1, "name": "赵六", "scores": [85, 90, 78]}, {"id": 2, "name": "钱七", "scores": [92, 88, 95]} ] } ''' data = json.loads(complex_json) # 获取第一个学生的平均分 first_student_avg = sum(data["students"][0]["scores"]) / len(data["students"][0]["scores"]) print(f"第一个学生平均分: {first_student_avg}") # 输出: 84.333...
JavaScript:原生API与JSON对象
JavaScript作为JSON的“母语”,处理JSON更直接,核心方法是JSON.parse()
(字符串转对象)和JSON.stringify()
(对象转字符串)。
(1)JSON字符串 → JavaScript对象
// JSON字符串(双引号) const jsonStr = '{"name": "周八", "age": 22, "skills": ["JavaScript", "Python"]}'; // 解析为JS对象 const data = JSON.parse(jsonStr); console.log(data.name); // 输出: 周八 console.log(data.skills[1]); // 输出: Python
(2)JavaScript对象 → JSON字符串
const jsObj = { name: "吴九", age: 35, isDeveloper: true, projects: ["Web应用", "数据分析"] }; // 转换为JSON字符串(null, 2用于格式化) const jsonStr = JSON.stringify(jsObj, null, 2); console.log(jsonStr); // 输出(格式化后): // { // "name": "吴九", // "age": 35, // "isDeveloper": true, // "projects": [ // "Web应用", // "数据分析" // ] // }
(3)实战:处理API返回的JSON数据
假设从API获取的JSON响应:
const apiResponse = ` { "code": 200, "message": "success", "data": { "users": [ {"id": 1, "username": "user1"}, {"id": 2, "username": "user2"} ] } } `; const response = JSON.parse(apiResponse); const users = response.data.users; console.log(users.map(u => u.username)); // 输出: ["user1", "user2"]
Java:用Gson
或Jackson
库
Java本身没有内置JSON解析方法,需借助第三方库(如Google Gson、Jackson),这里以Gson为例:
(1)添加依赖(Maven)
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
(2)JSON字符串 → Java对象
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; // JSON字符串 String jsonStr = "{\"name\":郑十,age:27,hobbies:[\"篮球\",\"代码\"]}"; // 解析为Java对象(Map) Gson gson = new Gson(); java.util.Map<String, Object> data = gson.fromJson(jsonStr, new TypeToken<java.util.Map<String, Object>>(){}.getType()); System.out.println(data.get("name")); // 输出: 郑十 // 解析为自定义Java类(需定义实体类) class Person { private String name; private int age; private java.util.List<String> hobbies; // getter/setter省略 } Person person = gson.fromJson(jsonStr, Person.class); System.out.println(person.getHobbies().get(0)); // 输出: 篮球
(3)Java对象 → JSON字符串
Person person = new Person(); person.setName("孙十一"); person.setAge(29); person.setHobbies(java.util.Arrays.asList("旅行", "摄影")); Gson gson = new Gson(); String jsonStr = gson.toJson(person); System.out.println(jsonStr); // 输出: {"name":"孙十一","age":29,"hobbies":["旅行","摄影"]}
JSON解析常见问题与解决方案
语法错误:如何快速定位问题?
常见错误:单引号包围字符串、末尾逗号、数据类型不匹配(如JSON中undefined
是非法的)。
解决方法:
- 使用在线JSON格式化工具(如JSONLint)校验语法;
- 检查字符串是否为空或包含特殊字符(如换行符需转义
\n
)。
数据类型转换错误
场景:Python中json.loads()
会将JSON数字转为int
或float
,但如果数字超出语言范围(如JavaScript中Number.MAX_SAFE_INTEGER
),可能导致精度丢失。
解决方法:
- Python中用
decimal
模块处理高精度数字; - JavaScript中用
BigInt
处理大整数(如const bigInt = BigInt("9007199254740993")
)。
嵌套数据解析困难
场景:
还没有评论,来说两句吧...