温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python怎么解析JSON

发布时间:2022-01-26 09:46:04 来源:亿速云 阅读:169 作者:iii 栏目:开发技术

这篇“python怎么解析JSON”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“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字符进行转义。

如果该参数为True,则将字符串中的非ascii字符转义成unicode字符串,否则,将不会进行转义。

 check_circular=True 是否进行容器类型的循环引用检查。

如果该参数设置为False,则不进行检查,但是可能会引发OverflowError或更严重的情况。

如果该参数设置为True,则将进行容器类型的循环引用检查,并在发现循环引用时抛出异常。

 allow_nan=True 是否允许序列化超出范围的float类型的值(如float('inf')float('-inf')float('nan'))。

如果该参数设置为True,则上面列出的那些值将依次使用JavaScript中等价的值(Infinity-InfinityNaN)来进 行替代;

如果该参数设置为False,并且要序列化的对象中出现了那些超出范围的值,则将引发ValueError异常。

 indent=None 是否在数组元素和对象成员前增加缩进以便使格式更加美观。

如果该参数设置为大于等于1的整数,则添加换行符和对应数量的空格表示缩进,如果设置为0,则表示只添加换行符,如果设置为None,则表示无缩进。

 separators=None 设置Json中各项之间、对象的键和值之间的分隔符;

该参数必须是一个2元组,元组第一个元素表示Json数据中各项之间的分隔符,元组的第二个元素表示Json对象的键和值之间的分隔符。默认的分隔符为(’,’, ‘:’)

 default=None 指定一个函数,用来将不可进行序列化的Python对象转化为可序列化的Python对象。
 cls=None 指定一个定制的JSONEncoder的子类(例如,重写了.default()方法用来序列化附加的类型),指定该参数时请使用cls关键字参数。如果未指定该参数,则将使用默认的JSONEncoder
 sort_keys=False 是否要将对象中字典元素按照key进行排序。

默认为False,即不进行排序,若指定为True,则会进行排序。

举个简单的例子(以下是小编在某篇文章中的例子,里面就用到了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.yisu.com'
    }
    # 在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字符串的时候遵循以下转换规则:

PythonJson
dictobject
list, tuplearray
strstring
int, floatnumber
Truetrue
Falsefalse
Nonenull

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

接受一个可调用对象,用于处理解码后生成的Python对象中dict类型的值。

注意,这个处理过程是递归进行的,即返回的Python对象内部所有的字典结构都将被这个方法处理

 parse_float=None

用于处理解码后的Python对象中的float类型的值。

 parse_int=None 接受一个可调用对象,用于处理解码后的Python对象中的int类型的值。
 parse_constant=None接受一个可调用对象,用于解码时对Infinity-InfinityNaN或其他非法的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对象也遵循一定的规则:

JsonPython
objectdict
arraylist
stringstr
number(int)int
number(real)float
trueTrue
falseFalse
nullNone

以上就是关于“python怎么解析JSON”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI