JSON (JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于将数据从一个应用程序传输到另一个应用程序。它基于JavaScript语言的一个子集,但已成为跨编程语言和平台的通用数据格式。
JSON格式的数据在许多场景中都得到广泛应用,如应用程序配置文件,特别是在Web开发中,它常用于API的数据传输和存储、配置文件的格式化以及与前端应用程序之间的数据交换。
1、 json文件的优点
- 简洁明了:JSON使用简单的语法来表示数据,易于阅读和编写。
- 跨平台和语言:JSON是一种通用的数据格式,可以在不同的编程语言和操作系统之间进行数据交换。
- 高效性:JSON数据量相对较小,传输和存储效率高。
- 易于解析:JSON数据可以很容易地解析为程序可用的数据结构。
2、json数据的组成
JSON数据由键值对组成,JSON表示的对象就是标准的JavaScript语言的对象。它支持的类型,以及对应的python类型如下表所示:
类型 | JSON类型 | Python类型 |
对象(Object):表示键值对集合,使用花括号括起来,键和值之间用冒号分隔,键值对之间用逗号分隔。 | {} | dict |
数组(Array):表示有序的值列表,使用方括号括起来,值之间用逗号分隔。 | [] | list |
字符串(String):表示文本数据,使用双引号括起来。 | “string” | str |
数字(Number):表示整数或浮点数。 | 1234.56 | int或float |
布尔值(Boolean):表示真或假。 | true/false | True/False |
空变量 | null | None |
3、json文件解析
当处理包含结构化数据的JSON格式数据时,Python提供了内置的 json模块,它提供了一组功能强大的工具,用于解析和处理JSON数据。主要提供了四个主要的函数:dump、dumps、load和 loads。这些函数提供了在JSON数据和Python对象之间进行转换和序列化的功能。
(1) 导入json模块
首先,导入 json模块。这个是废话,但一定要说。
import json
(2) 解析json字符串
json模块提供了 loads()函数,用于将JSON字符串解析为Python对象(通常是字典或列表)。
json_string = '{"name": "张三", "age": 30, "city": "北京"}'
data = json.loads(json_string)
print(data) # 输出: {'name': '张三', 'age': 30, 'city': '北京'}
在上例中,json_string是包含JSON数据的字符串,json.loads()将其解析为Python对象,并将结果赋值给 data变量。
(3) 解析json文件
如果要从json文件中读取数据,可以使用 json.load()函数。这个在前面的《pyhon文本文件的读取》有描述。
with open('data.json') as f:
data = json.load(f)
print(data)
例子中的data.json的内容格式要符合json语法规则。data.json的内容如下:
{"name": "张三", "age": 30, "city": "北京"}
在上例中,我们使用 open()函数打开json文件,并将其传递给 json.load()函数进行解析。解析结果将存储在 data变量中。
(4) 访问解析后的数据
解析JSON后,我们可以通过键或索引访问其中的数据。
print(data['name']) # 输出: '张三'
print(data['age']) # 输出: 30
在上例中,使用键来访问解析后的字典中的值。
(5) 将Python对象转换为json
除了解析json,json模块还提供了函数用于将Python对象转换为json字符串。
data = {'name': '张三', 'age': 30, 'city': '北京'}
json_string = json.dumps(data)
print(json_string) # 输出: {"name": "\u5f20\u4e09", "age": 30, "city": "\u5317\u4eac"}
在上例中,使用 json.dumps()将Python字典转换为json字符串。
(6) 解析json异常
如果提供的json数据无效,解析过程将引发 JSONDecodeError异常。如:缺少引号或不配对、花括号缺少或不配对、其他不符合json语法规则的情况。
json_string = '{"name": "张三", age: 30, "city": "北京"}'
data = json.loads(json_string) # 引发JSONDecodeError异常
#JSONDecodeError: Expecting property name enclosed in double quotes
在上例中,json字符串中的 age, 由于缺少引号,导致解析失败,出现错误提示JSONDecodeError: Expecting property name enclosed in double quotes。
如果尝试访问json数据中不存在的键,也将引发 KeyError异常。
print(data['address']) # 引发KeyError异常
在上例中,json数据中没有对应的 address键,因此访问该键名,就引发异常,出现错误提示 KeyError: 'address'。
4、json文件保存
有时候,业务场景需要将修改或者处理后的json信息保存下来,代码示例如下。
a = {"name": "张三", "age": 30, "city": "北京"}
b = json.dumps(a)
fp = open('new_json.json', 'w')
fp.write(b)
fp.close()
通过json.dumps()把dict降级为字符串,再将字符串写入json文件中。道理就是这样子的。