python如何解析JSON? JSON模块详解!
小编最近在整理网站的JSON教程的时候,发现JSON教程中python解析JSON的相关内容比较老旧,翻阅了python教程发现python教程也比较老旧,在python2.6版本中JSON模块已经变成了python内置模块了,而两本手册介绍的还是demjson模块的方法。所以今天小编整理了一遍python内置的JSON模块的使用方法介绍,希望能给各位小伙伴带来一点帮助。
简介
JSON模块是python内置的用来进行python对象序列化和反序列化的模块。
序列化,指将python对象转换为json格式的数据流,反序列化则是将json格式的数据流转换为python对象。
该模块中常用的方法有以下四个:
-
json.dump
将Python对象序列化为Json格式的数据流并写入文件类型的对象中
-
json.dumps
将Python对象序列化为Json格式的字符串
-
json.load
从文件类型的对象中读取Json格式的数据并反序列化成Python对象
-
json.loads
将包含Json格式数据的字符串反序列化成Python对象
两个dump函数是将python对象转换为json,可以理解为编码(类似demjson的encode函数),两个load函数是将json转换为python对象,可以理解为JSON解析(类似demjson的code函数)。因为两个dump和两个load的功能相似,所以小编只介绍其中一个(介绍JSON格式数据的字符串的编码与解析,也就是dumps和loads函数)。
json.dumps()
dumps可以传递的参数如下:
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False)
在日常使用中,更多的情况我们只传递必须的obj参数(这是一个对象),其他参数为可选参数,下表是该函数的所有参数的作用:
参数 | 作用 | |||
obj (必选项) |
要序列化的python对象 | |||
skipkeys=False |
是否跳过要序列化的对象中字典元素的key不是基本类型的数据;
如果为 True ,则跳过,如果为
False ,将抛出
TypeError 异常。
|
|||
ensure_ascii=True |
是否将要序列化的对象中的字符串中的非ascii字符进行转义。 | |||
check_circular=True |
是否进行容器类型的循环引用检查。 | |||
allow_nan=True |
是否允许序列化超出范围的float
类型的值(如float('inf')
、float('-inf')
、float('nan')
)。
|
|||
indent=None |
是否在数组元素和对象成员前增加缩进以便使格式更加美观。 | |||
separators=None |
设置Json中各项之间、对象的键和值之间的分隔符; | |||
default=None |
指定一个函数,用来将不可进行序列化的Python对象转化为可序列化的Python对象。 | |||
cls=None |
指定一个定制的JSONEncoder
的子类(例如,重写了.default()
方法用来序列化附加的类型),指定该参数时请使用cls
关键字参数。如果未指定该参数,则将使用默认的JSONEncoder
。
|
|||
sort_keys=False |
是否要将对象中字典元素按照key进行排序。 |
举个简单的例子(以下是小编在某篇文章中的例子,里面就用到了json.dumps方法):
from flask import Flask
import json
app = Flask(__name__)
@app.route('/hello') # 规定url,当请求的url为/hello时执行注解下的函数
def hello_world():
data = {
'no': 1,
'name': 'W3CSchool',
'url': 'http://www.w3cschool.cn'
}
# 在python中,与json对应的数据格式是字典,所以我们这边创建一个字典用来存储数据与返回
print(type(data))
# 打印,确定数据类型是字典
json_str = json.dumps(data)
# 使用dumps将字典类型转换为字符串,这样才能通过http协议返回
# json在传输时是以字符串进行传输的
return json_str # 使用flask,可以直接用return返回这个字符串,即可将json返回
if __name__ == '__main__':
app.run() # 运行这个flask项目
python对象转化为JSON字符串的时候遵循以下转换规则:
Python | Json |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
json.loads()
loads可以传递的参数如下:
json.loads(s,encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None)
在日常使用中,更多的情况我们只传递必须的s参数(这是一个字符串),其他参数为可选参数,下表是该函数的所有参数的作用:
参数 | 作用 | |||
s (必选项) |
要反序列化的JSON字符串 | |||
encoding=None
|
该参数已弃用,将会被忽略 | |||
cls=None
|
指定一个定制的JsonDecoder
子类,以便实现特定的反序列化需求;
|
|||
object_hook=None
|
||||
parse_float=None |
用于处理解码后的Python对象中的 |
|||
parse_int=None |
接受一个可调用对象,用于处理解码后的Python对象中的int
类型的值。
|
|||
parse_constant=None |
接受一个可调用对象,用于解码时对
Infinity 、
-Infinity 、
NaN 或其他非法的Json数值的处理。
|
|||
object_parse_hook=None |
如果指定了该参数并且设置为一个可调用对象,那么Json对象将被解码成一个元素为二元组的列表,二元组的两个元素分别为Json对象中的键值对的键和值,并且列表中元素的顺序与Json对象中键值对的顺序一致。 |
举个简单的例子(以下是小编在某篇文章中的例子,里面就用到了json.loads方法,而且刚好和上一篇文章是姊妹篇,不过虽然是姊妹篇,但并不是同一个项目,也就是说JSON数据不是找上一个项目请求的):
import requests
import json
response = requests.get('http://www.kuaidi100.com/query?type=ems&postid=111111111111')
# 使用request请求一个json,这里的快递单号是小编随便编写的
print(response)
print(type(response))
# 打印后发现这是一个对象
response = response.text
# 使用requests的的text方法取出响应的文本
print(response)
print(type(response))
# 打印后发现是个字符串(JSON在传输的时候是以字符串进行传输的)
response = json.loads(response)
# 使用JSON模块的loads方法,可以将这个字符串进行编码,
print(response)
print(type(response))
# 打印结果,发现是字典(JSON对应JavaScript的对象,对应python的字典,对应java的map)
response = json.dumps(response)
# 使用JSON的的dumps方法,可以把字典转化为字符串(JSON的传输是以字符串传输的,)
print(response)
print(type(response))
与序列化的过程类似,JSON转化为python对象也遵循一定的规则:
Json | Python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
小结
以上就是JSON模块的详细介绍了,其他语言的JSON编码与解析小编也会在后续的文章中继续更新,希望小伙伴们持续关注W3Cschool。