python中的json模块常用方法汇总
作者:安一缸 发布时间:2022-02-27 01:35:09
一、概述
推荐使用参考网站: json
在python中,json模块可以实现json数据的序列化和反序列化
序列化:将可存放在内存中的python 对象转换成可物理存储和传递的形式
实现方法:load() loads()
反序列化:将可物理存储和传递的json数据形式转换为在内存中表示的python对象
实现方法:dump() dumps()
二、方法详解
1.dump()
def 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):
1.把python对象obj转换成物理表现形式fp流。其中fp的.write()可以支持写入类文件中
2.如果skipkeys是true,那么在处理json对象的时候,仅支持 (str, int, float, bool, None) 这些基本类型的key,如果有非基本类型,就会抛出TypeError异常;如果值为false,那么对于非基本类型,则会抛出TypeError;默认值为false
3.如果ensure_ascii是true,那么obj中字符在写入fp的时候,非ascii字符会被进行转义;如果值为false,那么对于这些非ascii字符不会进行转义,会原样写入;默认值为true
4.如果check_circular是false,那么遇到container类型(list,dict,自定义编码类型)的时候,不会循环引用检查,一旦是循环引用,结果就是OverflowError;如果值为true,那么会对container类型进行循环引用检查,检查失败会 raise ValueError(“Circular reference detected”);默认值是true
5.如果allow_nan是false,严格遵守json的规范,对于序列化一些超出float范围的值(nan, inf, -inf)的时候,会抛出ValueError;如果值为true,那么超过float范围的值将会使用在JavaScript中的等效值(NaN, Infinity, -Infinity);默认值为true
6.如果indent是一个non-negative (正)整数,那么json中的数组元素和对象元素都将会使用indent单位缩进格式来进行输出;值为0的时候,就只会插入一个换行符;值为None的时候,会输出最紧凑的格式
7.separators的指定是以元组(item_separator, key_separator)的方式;如果indent=‘None’ 那么该选项的默认值为(', ', ': '),否则该选项的默认值为(',', ': ');如果想要紧凑的json表达,那么应该使用(',', ': ')来去除空格
8.default(obj)是一个函数,主要是针对于那些无法被直接序列化的对象。该参数可以提供一个默认的序列化版本,否则就会抛出一个TypeError。默认是抛出TypeError
9.如果sort_keys是true,那么输出的时候会根据key进行排序,默认值是false可以指定一个JSONEncoder的子类,来序列化其他的类型,可以通过cls或者是JSONEncoder参数来指定
2.dumps
def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw):
4.把obj序列化成一个json格式的字符串,并返回该字符串支持的python内置可进行json序列化的类型有(str, int, float, bool, None,list,tuple,dict)如果无法序列化的类型,会抛出TypeError
2.其他参数同上解释
3.load
def load(fp, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
1.把物理表现形式fp流(fp.read()的返回需要是一个json格式)反序列化成一个python对象
2.object_hook是一个可选的函数,主要用来对直接反序列化之后的结果进行二次加工;object_hook的参数只有一个,是dict,该dict也是反序列化的直接结果;object_hook的返回值为load方法的返回值 ;这个功能一般是用来自定 * 码器,例如JSON-RPC
3.object_pairs_hook是一个可选的函数,主要用来对直接反序列化之后的结果进行二次加工;object_pairs_hook的参数只有一个,是list(tuple),该list(tuple)也是反序列化的直接结果;object_pairs_hook的返回值为load方法的返回值 ;这个功能一般是用来自定 * 码器,例如JSON-RPC;在同时指定了object_hook和object_pairs_hook的时候,object_pairs_hook的优先级高于object_hook
4.cls的关键字参数,支持使用自定义的JSONDecoder的子类;如果不指定,默认使用JSONDecoder
4.loads
def loads(s, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
1.反序列化一个s(包含json文本的str,bytes,bytearray的实例对象)到一个python对象
2.object_hook 同上
3.object_pairs_hook同上
4.parse_float 如果定义了,那么会在对json字符串中的每一个float进行解码的时候调用;默认情况下等价于 float(num_str);也可以使用其他的数据类型,如(e.g. decimal.Decimal)
5.parse_int 如果定义了,那么会在对json字符串中的每一个float进行解码的时候调用;默认情况下,等价于 int(num_str);也可使用其他针对于json中的integer的datatype或者是parser
6.parse_constant 如果定义了,那么在碰到-Infinity, Infinity, NaN.这些的时候会被调用;如果遇到无效的json符号,会抛出异常
三、代码实战
1.dumps()
import json
if __name__ == '__main__':
# 测试格式化非json格式数据
print('-------------测试格式化非json格式数据----------------')
a = json.dumps(2.0)
print(a, type(a))
a = json.dumps(tuple())
print(a, type(a))
a = json.dumps([])
print(a, type(a))
# 测试格式化json格式数据
print('-------------测试格式化json格式数据----------------')
j = {'a': 1, 'b': 6}
a = json.dumps(j)
print(a, type(a))
# 测试skipkeys参数
print('-------------测试skipkeys参数----------------')
j = {'a': 1, tuple(): 6}
a = json.dumps(j, skipkeys=True)
print(a, type(a))
# 测试indent参数
print('-------------测试indent默认参数----------------')
j = {'a': 1, 'b': 234}
a = json.dumps(j)
print(a, type(a))
print('-------------测试indent=0参数----------------')
a = json.dumps(j, indent=0)
print(a, type(a))
print('-------------测试indent=2参数----------------')
a = json.dumps(j, indent=2)
print(a, type(a))
print('-------------测试separators参数----------------')
a = json.dumps(j, separators=('[', ']'))
print(a, type(a))
2.dump()
import json
if __name__ == '__main__':
# 测试格式化非json格式数据
fp = open('./json_dump_data', mode='w')
print('-------------测试格式化非json格式数据----------------')
a = json.dump(2.0, fp)
fp.write('\n')
a = json.dump(tuple(), fp)
a = json.dump([], fp)
fp.write('\n')
# 测试格式化json格式数据
j = {'a': 1, 'b': 6}
a = json.dump(j, fp)
cat json_dump_data:
1和2中很多参数都是相同的,这里就不再详述3.load()
import json
if __name__ == '__main__':
j = open('./json_data', mode='r')
# 测试默认参数
a = json.load(j)
print('-------------测试默认参数----------------')
print(a)
# 测试object_hook参数
j = open('./json_data', mode='r')
a = json.load(j, object_hook=lambda x: x.get('b'))
print('-------------测试object_hook参数----------------')
print(a)
# 测试object_pairs_hook参数
j = open('./json_data', mode='r')
loads = json.load(j, object_pairs_hook=lambda x: print(type(x), type(x[2])))
print('-------------测试object_pairs_hook参数----------------')
print(loads)
# 测试parse_constant参数
j = open('./json_data', mode='r')
loads = json.load(j, parse_constant=lambda x: 'not notification')
print('-------------测试parse_constant参数----------------')
print(loads)
# 测试parse_int参数
j = open('./json_data', mode='r')
loads = json.load(j, parse_int=lambda x: 'cutomer int')
print('-------------测试parse_int参数----------------')
print(loads)
# 测试parse_float参数
j = open('./json_data', mode='r')
loads = json.load(j, parse_float=lambda x: 'cutomer float')
print('-------------测试parse_float参数----------------')
print(loads)
注:
因为load方法的底层是调用了fp.read(),所以每一次重新调用load的时候都需要重新打开文件句柄。不然就会导致在第二次调用load方法的时候,就会因为fp.read()返回的是none就导致异常
4.loads()
import json
if __name__ == '__main__':
j = '{"a":1,"b":2.0,"c":Infinity}'
# 测试默认参数
a = json.loads(j)
print('-------------测试默认参数----------------')
print(a)
# 测试object_hook参数
a = json.loads(j, object_hook=lambda x: x.get('b'))
print('-------------测试object_hook参数----------------')
print(a)
# 测试object_pairs_hook参数
loads = json.loads(j, object_pairs_hook=lambda x: print(type(x), type(x[2])))
print('-------------测试object_pairs_hook参数----------------')
print(loads)
# 测试parse_constant参数
loads = json.loads(j, parse_constant=lambda x: 'not notification')
print('-------------测试parse_constant参数----------------')
print(loads)
# 测试parse_int参数
loads = json.loads(j, parse_int=lambda x: 'cutomer int')
print('-------------测试parse_int参数----------------')
print(loads)
# 测试parse_float参数
loads = json.loads(j, parse_float=lambda x: 'cutomer float')
print('-------------测试parse_float参数----------------')
print(loads)
来源:https://blog.csdn.net/javadocdoc/article/details/125031927
猜你喜欢
- 代码如下所示:表landundertake结构如下所示:表appraiser结构如下所示:access代码:代码如下:TRANSFORM F
- 1、生成 servie.yaml1.1、yaml转jsonservice模板yamlapiVersion: v1kind: Servicem
- 在Python中,代码越少越好、越简单越好。基于这一思想,需要掌握Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码。代
- 从有道词典网页获取某单词的中文解释。import reimport urllibword=raw_input('input a wo
- 百度有啊2009年情人节logo——大纸袋GG给大纸袋MM送了枝玫瑰花,大纸袋MM奖励了大纸袋GG一个吻,好可爱!淘宝网2009年情人节lo
- 本文实例讲述了python分支、循环简单用法。分享给大家供大家参考,具体如下:讲程序设计,不得不讲到顺序、分支、循环。顺序就是从上到下运行代
- MySQL Group By用法我们现在回到函数上。记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是
- DROP PRIMAY DEY用于取消主索引。注释:在MySQL较早的版本中,如果没有主索引,则DROP PRIMARY KEY会取消表中的
- 在日常开发中,我们进行用户登录的时候,大部分情况下都会使用 session 来保存用户登录信息,并以此为依据判断用户是否已登录。但其实 HT
- 3月27日,淘宝网获得了由国际权威机构G-CEM颁发的2008年度亚洲区在线客户体验大奖,这是全球互联网企业首次获得此殊荣。如何在让买家更方
- 随着网络的发展,人们通过各种方式使用它。今天,网络购物,跟朋友或者不认识的人聊天,管理银行账户,以及一些日常应用,共享照片或视频,等等。事实
- 一、绘制带趋势线的散点图实现功能:在散点图上添加趋势线(线性拟合线)反映两个变量是正相关、负相关或者无相关关系。实现代码:import pa
- 在查看Mysql对文件的操作中,它在不同的操作系统上对文件的操作,除了使用标准C运行库函数,包括open、close、seek等,在Win3
- PHP中重定向网页跳转页面的方法(共三种)第一种:利用header()函数进行重定向,这也是我用的较多的。(注意!locationhe和“:
- 1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数
- //获取元素的样式值。 function getStyle(elem,name){ if(elem.style[name]){ return
- 1. 引言使用Python进行图像处理,非常快捷方便,往往简短几行代码就可以实现功能强大的效果。在这篇文章中,我们将使用Python来将图像
- 使用suds这个第三方模块from suds.client import Clienturl = 'http://ip:port/?
- 广州4.18书友会主题的内容提纲自己参与撰写,同时还参与组织和主持。通过这次的深入参与,我发现胡晓同学能坚持下来多不容易,先赞下。由于天公不
- Django模板系统压根儿就没想过实现一个全功能的编程语言,所以它不允许我们在模板中执行Python的语句(还是那句话,要了解更多请参看理念