从零开始解析JSON:一篇简明扼要的指南**
在当今的软件开发领域,JSON(JavaScript Object Notation)已经成为一种极其流行的数据交换格式,无论是Web API的响应、配置文件的存储,还是移动应用与服务器之间的通信,我们几乎都能看到JSON的身影,JSON究竟是什么?我们又该如何解析它呢?本文将为你一一解答。
什么是JSON?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,但独立于编程语言,它易于人阅读和编写,也易于机器解析和生成。
JSON的结构主要有两种:
-
对象(Object):用花括号 表示,是一组无序的键值对(key-value pair)集合,键(key)必须是字符串,值(value)可以是字符串、数字、布尔值、null、数组,甚至是另一个对象。
- 示例:
{"name": "张三", "age": 30, "isStudent": false}
- 示例:
-
数组(Array):用方括号
[]表示,是一组有序的值的集合,值可以是任何JSON支持的类型。- 示例:
[1, "apple", true, {"city": "北京"}]
- 示例:
一个完整的JSON文档,通常是一个对象或数组,其中可以嵌套其他对象或数组。
为什么要解析JSON?
当我们的程序(如一个Java后端服务、一个Python脚本或一个前端JavaScript应用)从外部接收到JSON格式的数据时,这个数据本质上只是一段文本字符串,计算机无法直接理解这段文本中的“键”和“值”所代表的逻辑关系。
解析JSON,就是将这段JSON格式的文本字符串,转换成编程语言中对应的数据结构(如Python的字典dict和列表list,Java的对象和List,JavaScript的Object和Array等),一旦转换完成,我们就可以方便地操作这些数据,
- 获取特定字段的值
- 遍历数组中的元素
- 修改对象的属性
- 进行计算或逻辑判断
解析就是将“通用文本语言”翻译成“编程语言能懂的数据结构”的过程。
如何解析JSON?(主流编程语言示例)
几乎所有的现代编程语言都内置了或提供了库来处理JSON,下面我们以几种常见语言为例,看看“怎么搞”。
JavaScript (前端及Node.js)
JavaScript对JSON的原生支持是最好的。
-
解析JSON字符串为JavaScript对象:使用
JSON.parse()方法。const jsonString = '{"name": "李四", "age": 25, "hobbies": ["reading", "music"]}'; // 解析 const obj = JSON.parse(jsonString); // 现在可以像操作普通对象一样操作它 console.log(obj.name); // 输出: 李四 console.log(obj.hobbies[0]); // 输出: reading -
将JavaScript对象转换为JSON字符串:使用
JSON.stringify()方法(序列化,与解析相反)。const obj = {name: "王五", age: 28}; const jsonString = JSON.stringify(obj); console.log(jsonString); // 输出: {"name":"王五","age":28}
Python
Python标准库中的 json 模块提供了强大的JSON处理功能。
-
解析JSON字符串为Python对象:使用
json.loads()(load string) 方法。import json json_string = '{"name": "赵六", "age": 32, "isMarried": true}' # 解析 data = json.loads(json_string) # 现在data是一个Python字典 print(data["name"]) # 输出: 赵六 print(data["isMarried"]) # 输出: True -
将Python对象转换为JSON字符串:使用
json.dumps()(dump string) 方法。import json data_dict = {"name": "钱七", "age": 35} json_string = json.dumps(data_dict, ensure_ascii=False) # ensure_ascii=False支持中文 print(json_string) # 输出: {"name": "钱七", "age": 35} -
从文件读取JSON并解析:使用
json.load()(无s) 方法。import json with open('data.json', 'r', encoding='utf-8') as f: data = json.load(f) print(data)
Java
Java中通常使用第三方库来处理JSON,其中最流行的是 Gson (Google) 和 Jackson。
以 Gson 为例:
添加Gson依赖(Maven):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
-
解析JSON字符串为Java对象:
import com.google.gson.Gson; public class Main { public static void main(String[] args) { String jsonString = "{\"name\":\"孙八\",\"age\":40}"; Gson gson = new Gson(); Person person = gson.fromJson(jsonString, Person.class); // Person类需要提前定义 System.out.println(person.getName()); // 输出: 孙八 System.out.println(person.getAge()); // 输出: 40 } } class Person { private String name; private int age; // getters and setters public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } -
将Java对象转换为JSON字符串:
Gson gson = new Gson(); Person person = new Person(); person.setName("周九"); person.setAge(45); String jsonString = gson.toJson(person); System.out.println(jsonString); // 输出: {"name":"周九","age":45}
C
C# 中可以使用内置的 System.Text.Json 命名空间(.NET Core 3.0+)或流行的第三方库 Newtonsoft.Json。
以 System.Text.Json 为例:
-
解析JSON字符串为C#对象:
using System; using System.Text.Json; public class Program { public static void Main() { string jsonString = @"{""name"":""吴十"",""age"":50}"; Person person = JsonSerializer.Deserialize<Person>(jsonString); Console.WriteLine(person.Name); // 输出: 吴十 Console.WriteLine(person.Age); // 输出: 50 } } public class Person { public string Name { get; set; } public int Age { get; set; } } -
将C#对象转换为JSON字符串:
using System.Text.Json; Person person = new Person { Name = "郑十一", Age = 55 }; string jsonString = JsonSerializer.Serialize(person); Console.WriteLine(jsonString); // 输出: {"name":"郑十一","age":55}
解析JSON时的注意事项
- 格式错误:JSON对格式要求非常严格,键名必须用双引号包裹,不能用单引号;最后一个键值对后不能有逗号,如果格式错误,解析过程通常会抛出异常(如
JSON.parse()会抛出SyntaxError),在解析前最好确保JSON字符串的来源是可靠的,或使用JSONLint等工具进行校验。 - 数据类型转换:不同编程语言的数据类型与JSON类型不完全对应,JSON中的数字在解析时可能会被转换为语言中的
int、long或double,需要注意精度问题,JSON中的布尔值true/false会转换为对应语言的布尔类型。 - 安全性:不要直接解析来自不可信源的JSON字符串,特别是当解析结果会被用于动态执行代码时(尽管JSON本身不包含代码,但解析后的数据可能被注入到其他代码中),防止JSON注入攻击。
- 编码:JSON标准通常使用UTF-8编码,在处理文件或网络流时,要注意编码的一致性。
解析JSON是现代程序员的一项基本技能,其核心思想就是将符合JSON格式的文本字符串,通过语言内置或第三方提供的解析器,转换成该语言原生支持的数据结构(对象/字典/Map等),从而方便程序后续的处理和使用。
无论是前端JavaScript的JSON.parse(),Python的json.loads(),还是Java的Gson/Jackson,亦或是C#的System.Text.Json



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