JSON文本怎么解析:从基础到实践的全面指南
什么是JSON?为什么需要解析它?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,以易读、易写的文本形式存储和传输数据,它采用键值对(Key-Value)的结构,类似于编程语言中的字典或对象,是前后端数据交互、API响应、配置文件存储等场景的常用格式。
但计算机无法直接“理解”JSON文本中的字符串内容,必须通过解析将其转换为程序可识别的数据结构(如Python的字典、Java的Map、JavaScript的对象等),才能进行数据处理、逻辑运算等操作,JSON解析方法是开发者的必备技能。
JSON的基本语法规则
解析JSON前,需先熟悉其核心语法,避免因格式错误导致解析失败:
- 键值对:数据以
"key": value的形式存在,键必须是字符串(用双引号包裹),值可以是字符串、数字、布尔值、数组、对象或null。{"name": "张三", "age": 25, "isStudent": true} - 数组:值可以是多个数据组成的列表,用方括号
[]包裹,元素间用逗号分隔。{"hobbies": ["reading", "coding", "traveling"]} - 嵌套结构:值可以是另一个对象或数组,支持多层嵌套。
{"info": {"city": "北京", "zip": 100000}, "scores": [90, 85, 78]} - 特殊值:
null表示空值,布尔值为true/false(全小写),数字不区分整数和浮点数。
主流编程语言中的JSON解析方法
不同编程语言提供了内置库或第三方工具来解析JSON,以下是常见语言的实践示例。
Python:使用json模块
Python标准库json提供了loads()(解析字符串)和load()(解析文件)方法,支持将JSON转换为字典(dict),也可通过dumps()和dump()反向转换为JSON字符串。
示例:解析JSON字符串
import json
json_str = '{"name": "李四", "age": 30, "contacts": {"email": "lisi@example.com", "phone": "13800138000"}}'
data = json.loads(json_str) # 解析为字典
print(data["name"]) # 输出: 李四
print(data["contacts"]["email"]) # 输出: lisi@example.com
示例:解析JSON文件
假设存在data.json为:
{"name": "王五", "age": 28, "hobbies": ["游泳", "摄影"]}
解析代码:
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data["hobbies"][0]) # 输出: 游泳
异常处理:若JSON格式错误(如缺少引号、逗号),会抛出json.JSONDecodeError,需捕获处理:
try:
data = json.loads('{"name": "赵六", "age":}') # 缺少age的值
except json.JSONDecodeError as e:
print(f"JSON解析错误: {e}") # 输出: JSON解析错误: Expecting value: line 1 column 23 (char 22)
JavaScript:原生方法与JSON对象
JavaScript作为JSON的“起源语言”,解析极为简单,可直接使用JSON.parse()(字符串转对象)和JSON.stringify()(对象转字符串)。
示例:解析JSON字符串
const jsonStr = '{"name": "钱七", "age": 35, "skills": ["JavaScript", "Python"]}';
const data = JSON.parse(jsonStr);
console.log(data.name); // 输出: 钱七
console.log(data.skills[1]); // 输出: Python
示例:处理嵌套对象
const nestedJson = '{"user": {"id": 101, "profile": {"city": "上海"}}}';
const data = JSON.parse(nestedJson);
console.log(data.user.profile.city); // 输出: 上海
异常处理:格式错误时会抛出SyntaxError,需用try-catch捕获:
try {
const data = JSON.parse('{"name": "孙八", "age": 40,}'); // 末尾逗号错误
} catch (e) {
console.error("JSON解析错误:", e.message); // 输出: JSON解析错误: Unexpected token } in JSON
Java:使用Gson或Jackson库
Java没有内置JSON解析方法,需借助第三方库,常用的有Google的Gson和Jackson(需添加依赖)。
示例:使用Gson解析JSON字符串
首先添加Gson依赖(Maven):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
解析代码:
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class JsonParseExample {
public static void main(String[] args) {
String jsonStr = "{\"name\": \"周九\", \"age\": 45, \"isEmployed\": true}";
JsonObject data = JsonParser.parseString(jsonStr).getAsJsonObject();
System.out.println(data.get("name").getAsString()); // 输出: 周九
System.out.println(data.get("isEmployed").getAsBoolean()); // 输出: true
}
}
示例:解析嵌套JSON为对象
定义实体类:
public class User {
private String name;
private int age;
private Contact contact; // 嵌套对象
// getters和setters
}
public class Contact {
private String email;
private String phone;
// getters和setters
}
使用Gson解析:
import com.google.gson.Gson;
public class JsonParseExample {
public static void main(String[] args) {
String jsonStr = "{\"name\": \"吴十\", \"age\": 50, \"contact\": {\"email\": \"wushi@example.com\", \"phone\": \"13900139000\"}}";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);
System.out.println(user.getName()); // 输出: 吴十
System.out.println(user.getContact().getEmail()); // 输出: wushi@example.com
}
}
C#:使用Newtonsoft.Json或System.Text.Json
C#中,Newtonsoft.Json(第三方库,需通过NuGet安装)和System.Text.Json(.NET Core内置)是常用选择。
示例:使用System.Text.Json解析
using System.Text.Json;
var jsonStr = @"{""name"": ""郑十一"", ""age"": 28, ""hobbies"": [""画画"", ""音乐""]}";
var data = JsonDocument.Parse(jsonStr).RootElement;
Console.WriteLine(data.GetProperty("name").GetString()); // 输出: 郑十一
Console.WriteLine(data.GetProperty("hobbies")[1].GetString()); // 输出: 音乐
示例:反序列化为对象
定义实体类:
public class Person {
public string Name { get; set; }
public int Age { get; set; }
public List<string> Hobbies { get; set; }
}
解析代码:
using System.Text.Json;
var jsonStr = @"{""name"": ""王十二"", ""age"": 32, ""hobbies"": [""篮球"", ""编程""]}";
var person = JsonSerializer.Deserialize<Person>(jsonStr);
Console.WriteLine(person.Name); // 输出: 王十二
Console.WriteLine(person.Hobbies[0]); // 输出: 篮球
JSON解析的常见问题与解决方案
-
格式错误
- 问题:JSON字符串中缺少双引号(如
{name: "张三"})、逗号(如{"age": 25 "city": "北京"})或大括号不匹配。 - 解决:使用在线JSON格式化工具(如JSONLint)校验格式,确保键名用双引号包裹,元素间用逗号分隔(最后一个元素后无逗号)。
- 问题:JSON字符串中缺少双引号(如
-
编码问题
- 问题:JSON文件编码与解析时指定的编码不一致(如文件为UTF-8,代码中用GBK读取),导致乱



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