JSON库
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。
在Python中,我们常常会涉及到JSON数据的处理,它通常用于不同的应用程序之间进行数据交换。 这些数据可以被编码为JSON 数据,并在 web 应用程序中通过 XMLHttpRequest 对象发送到服务器。
Python 中的 json 模块提供了将 Python 对象转换为 JSON 格式,以及将 JSON 格式转换为 Python 对象的方法。
本章节我们将为大家介绍如何使用 Python 语言来编码和解码 JSON 对象。
JSON 与 Python 字典的对应关系
JSON 是一种轻量级的数据格式,它由键/值对组成,并使用逗号进行分隔。例如,以下是一个简单的 JSON 对象:
{
"name": "小明",
"age": 18,
"is_boy": true
}
Python 的字典对象也是由键/值对组成,并使用逗号进行分隔。 例如,以下是一个简单的 Python 字典:
{
"name": "小明",
"age": 18,
"is_boy": True
}
可以看到,JSON 对象与 Python 字典具有相同的键/值对结构。 因此,我们可以使用 json.loads() 方法将 JSON 数据转换为 Python 字典。
python 原始类型向 json 类型的转化对照表:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
JSON 库函数
使用 JSON 函数需要导入 json 库:import json。
函数 | 描述 |
---|---|
json.dumps | 将 Python 对象编码成 JSON 字符串 |
json.loads | 将已编码的 JSON 字符串解码为 Python 对象 |
json.dump() | 将python对象编码成json数据并写入json文件中 |
json.load() | 从json文件中读取数据并解码为Python对象 |
将 Python 对象转换为 JSON 数据(json.dumps)
除了将 JSON 数据转换为 Python 对象,我们还可以使用 json.dumps() 将 Python 对象转换为 JSON 数据。
- 语法
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
obj: 表示是要序列化的对象。
fp: 文件描述符,将序列化的str保存到文件中。json模块总是生成str对象,而不是字节对象;因此,fp.write()必须支持str输入。
skipkeys: 默认为False,如果skipkeysTrue,(默认值:False),则将跳过不是基本类型(str,int,float,bool,None)的dict键,不会引发TypeError。
ensure_ascii: 默认值为True,能将所有传入的非ASCII字符转义输出。如果ensure_ascii为False,则这些字符将按原样输出。
check_circular:默认值为True,如果check_circular为False,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError。
allow_nan: 默认值为True,如果allow_nan为False,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError。 如果allow_nan为True,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)。
indent: 设置缩进格式,默认值为None,选择的是最紧凑的表示。如果indent是非负整数或字符串,那么JSON数组元素和对象成员将使用该缩进级别进行输入;indent为0,负数或“”仅插入换行符;indent使用正整数缩进多个空格;如果indent是一个字符串(例如“\t”),则该字符串用于缩进每个级别。
separators: 去除分隔符后面的空格,默认值为None,如果指定,则分隔符应为(item_separator,key_separator)元组。如果缩进为None,则默认为(’,’,’:’);要获得最紧凑的JSON表示,可以指定(’,’,’:’)以消除空格。
default: 默认值为None,如果指定,则default应该是为无法以其他方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引发TypeError。如果未指定,则引发TypeError。
sort_keys: 默认值为False,如果sort_keys为True,则字典的输出将按键值排序。
以下实例将数组编码为 JSON 格式数据:
import json
data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
data2 = json.dumps(data)
print(data2)
以上代码执行结果为:
[{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]
使用参数让 JSON 数据格式化输出:
import json
data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
data2 = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '))
print(data2)
以上代码执行结果为:
[
{
"a": 1,
"b": 2,
"c": 3,
"d": 4,
"e": 5
}
]
例如,以下是将 Python 字典转换为 JSON 数据的示例:
import json
# 定义一个 Python 字典
data = {
"name": "小明",
"age": 18,
"is_boy": True,
"hobbies": ["游泳", "足球", "电影"],
"address": {
"city": "北京",
"province": "北京市",
"country": "中国"
}
}
# 将 Python 字典转换为 JSON 数据
json_str = json.dumps(data)
# 打印 JSON 字符串
print(json_str)
输出结果为:
{"name": "小明", "age": 18, "is_boy": true, "hobbies": ["游泳", "足球", "电影"], "address": {"city": "北京", "province": "北京市", "country": "中国"}}
我们可以使用 json.dumps() 方法指定一些额外的参数,例如使用缩进和排序:
import json
# 定义一个 Python 字典
data = {
"name": "小明",
"age": 18,
"is_boy": True,
"hobbies": ["游泳", "足球", "电影"],
"address": {
"city": "北京",
"province": "北京市",
"country": "中国"
}
}
# 将 Python 字典转换为 JSON 数据,使用缩进和排序
json_str = json.dumps(data, indent=4, sort_keys=True)
# 打印 JSON 字符串
print(json_str)
输出结果为:
{
"address": {
"city": "北京",
"country": "中国",
"province": "北京市"
},
"age": 18,
"hobbies": [
"游泳",
"足球",
"电影"
],
"is_boy": true,
"name": "小明"
}
将 JSON 数据转换为 Python 对象(json.loads)
json 模块提供了 loads() 函数来解析 JSON 数据并将其转换为 Python 对象。 loads() 函数接受一个字符串参数,该字符串包含 JSON 数据。该函数返回 Python 字段的数据类型。
- 语法
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
s
: 将s(包含JSON文档的str,bytes或bytearray实例)反序列化为Python对象。encoding
: 指定一个编码的格式。loads
也不需要文件描述符,其他参数的含义和load
函数的一致。
以下实例展示了Python 如何解码 JSON 对象:
import json
jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
text = json.loads(jsonData)
print(text)
以上代码执行结果为:
{u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}
例如,以下是将 JSON 字符串转换为 Python 字典的示例:
import json
# 定义一个 JSON 字符串
json_str = '{"name": "小明", "age": 18, "is_boy": true}'
# 将 JSON 字符串转换为 Python 字典
data = json.loads(json_str)
# 打印 Python 字典对象
print(data)
输出结果为:
{'name': '小明', 'age': 18, 'is_boy': True}
如上所述,json.loads() 函数将 JSON 数据转换为 Python 字典对象。
解析包含数组的 JSON 数据
除了简单的 JSON 对象外,JSON 数据可能还包含数组。在 Python 中,我们可以使用 list 类型来表示数组。
例如,以下是一个包含数组的 JSON 数据:
{
"name": "小明",
"age": 18,
"is_boy": true,
"hobbies": ["游泳","足球","电影"]
}
在 Python 中,我们将上面的 JSON 数据解析为以下 Python 字典:
{
"name": "小明",
"age": 18,
"is_boy": True,
"hobbies": ["游泳", "足球", "电影"]
}
我们可以使用 json.loads() 将其解析为 Python 字典对象:
import json
# 定义一个 JSON 字符串
json_str = '{"name": "小明", "age": 18, "is_boy": true, "hobbies": ["游泳","足球","电影"]}'
# 将 JSON 字符串转换为 Python 字典
data = json.loads(json_str)
# 打印 Python 字典对象
print(data)
输出结果为:
{
"name": "小明",
"age": 18,
"is_boy": True,
"hobbies": ["游泳", "足球", "电影"]
}
解析嵌套的 JSON 数据
JSON 格式允许对象和数组作为值的嵌套。在 Python 中,我们可以使用嵌套的字典和列表来表示这种嵌套。
例如,以下是一个嵌套的 JSON 数据:
{
"name": "小明",
"age": 18,
"is_boy": true,
"hobbies": ["游泳","足球","电影"],
"address": {
"city": "北京",
"province": "北京市",
"country": "中国"
}
}
在 Python 中,我们将上面的 JSON 数据解析为以下 Python 字典:
{
"name": "小明",
"age": 18,
"is_boy": True,
"hobbies": ["游泳", "足球", "电影"],
"address": {
"city": "北京",
"province": "北京市",
"country": "中国"
}
}
我们可以使用 json.loads() 将其解析为 Python 字典对象:
import json
# 定义一个 JSON 字符串
json_str = '{"name": "小明", "age": 18, "is_boy": true, "hobbies": ["游泳","足球","电影"],"address": {"city": "北京","province": "北京市","country": "中国"}}'
# 将 JSON 字符串转换为 Python 字典
data = json.loads(json_str)
# 打印 Python 字典对象
print(data)
输出结果为:
{
"name": "小明",
"age": 18,
"is_boy": True,
"hobbies": ["游泳", "足球", "电影"],
"address": {
"city": "北京",
"province": "北京市",
"country": "中国"
}
}
json文件相关
dump()和load()是json文件和python对象之间的转化
import json
data = {
"key1": "值1",
"key2": 222,
"key3": [12, True, False, None, "1ab"]
}
with open("data.json", "w") as f:
# 将Python对象存入json文件
json.dump(data, f)
print("--------------------------")
with open("data.json", "r") as f:
# 从文件中读取json数据并转成python对象
content = json.load(f)
print(type(content))
print(content)
执行成功后,data.json文件内容如下(中文被Unicode编码了):
{"key1": "\u503c1", "key2": 222, "key3": [12, true, false, null, "1ab"]}
程序运行输出如下:
--------------------------
<class 'dict'>
{'key1': '值1', 'key2': 222, 'key3': [12, True, False, None, '1ab']}
模拟考题
考题1 单选题
有如下程序代码:
import json
s = '''[{"name":"kingsan","age":23},
{"name":"xiaolan","age":22}]
'''
print(type(s))
data = json.loads(s)
print(data)
print(type(data))
下列说法正确的是?( )
A. s的数据类型是list
B. data的数据类型是字符串
C. loads()用于将字符串转化为JSON对象
D. JSON数据可以用双引号来包围,也可以用单引号
答案:C
解析:s的数据类型是str,data的数据类型是list;loads()方法将字符串转化为JSON对象;JSON数据需要用双引号来包围,不能使用单引号,不然易出现解析错误。
考题2 判断题
JSON(JavaScript Object Notation 对象表示法)是一种流行的结构化数据的方式,可以使用json.loads()返回JSON字符串。( )
答案:错误
解析:loads()用于将字符串转化为JSON对象
考题3 判断题
JSON的loads和load方法的区别是,loads操作的是字符串,load操作的是文件流。( )
答案:正确
解析:JSON的loads和load方法的区别是,loads操作的是字符串,load操作的是文件流。