Python中json模块的load/loads方法实战及参数详解
文章目录
- 前言
- 正文
- 1. loads方法与load方法的异同
- 1.1不相同点:
- 1.2 相同点
- 1.3 例子
- 2. 转换成Python对象
- 3. json.load(s)的参数
- 3.1 s参数
- 3.2 object_hook参数
- 3.3 object_pairs_hook参数
- 3.4 parse_float参数
- 3.5 parse_int参数
- 3.6 parse_constant参数
- 3.7 cls参数
前言
适用于python2和python3
正文
1. loads方法与load方法的异同
在Python中json是一个非常常用的模块,这个主要有4个方法:
json.dumps
json.dump
json.loads
json.load
这里主要分析讲解一下json的loads
和load
方法。
这两个方法中都是把其他类型的对象转为Python对象,这里先说明一下Python对象,
Python对象包括:
所有Python基本数据类型,列表,元组,字典,自己定义的类,等等等等,当然不包括Python的字符串类型,把字符串或者文件鎏中的字符串转为字符串会报错的
1.1不相同点:
loads
操作的是字符串load
操作的是文件流
1.2 相同点
- 除了第一个参数(要转换的对象)类型不同,其他所有的参数都相同
- 最终都是转换成Python对象
1.3 例子
先来一个例子,除了要转换的对象,其他什么参数都不传:
s = '{"name": "wade", "age": 54, "gender": "man"}'
# json.loads读取字符串并转为Python对象
print("json.loads将字符串转为Python对象: type(json.loads(s)) = {}".format(type(json.loads(s))))
print("json.loads将字符串转为Python对象: json.loads(s) = {}".format(json.loads(s)))# json.load读取文件并将文件内容转为Python对象
# 数据文件要s.json的内容 --> {"name": "wade", "age": 54, "gender": "man"}
with open('s.json', 'r') as f:s1 = json.load(f)print("json.load将文件内容转为Python对象: type(json.load(f)) = {}".format(type(s1)))print("json.load将文件内容转为Python对象: json.load(f) = {}".format(s1))
2. 转换成Python对象
由于loads
和load
两个方法只是处理的数据源不同,其他的参数都是相同的,返回的结果类型也相同,故这是loads
和load
方法两个只说一个,
日常工作中最常见的就是把字符串通过json.loads
转为字典,其实json的loads
方法不仅可以把字符串转为字典,还可以转为任何Python对象。
比如说,转成python
基本数据类型:
print('json.loads 将整数类型的字符串转为int类型: type(json.loads("123456"))) --> {}'.format(type(json.loads("123456"))))
print('json.loads 将浮点类型的字符串转为float类型: type(json.loads("123.456")) --> {}'.format(type(json.loads("123.456"))))
print('json.loads 将boolean类型的字符串转为bool类型: type(json.loads("true")) --> {}'.format((type(json.loads("true")))))
print('json.loads 将列表类型的字符串转为列表: type(json.loads(\'["a", "b", "c"]\')) --> {}'.format(type(json.loads('["a", "b", "c"]'))))
print('json.loads 将字典类型的字符串转为字典: type(json.loads(\'{"a": 1, "b": 1.2, "c": true, "d": "ddd"}\')) --> %s' % str(type(json.loads('{"a": 1, "b": 1.2, "c": true, "d": "ddd"}'))))
json模块会根据你的字符串自动转为最符合的数据类型,
但是需要注意的是不能把转为字符串,否则会报json.decoder.JSONDecodeError
错误:
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
3. json.load(s)的参数
我们先看下json.loads方法的签名:
def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):"""Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON # 把一个字符串反序列化为Python对象,这个字符串可以是str类型的,也可以是unicode类型的document) to a Python object.If ``s`` is a ``str`` instance and is encoded with an ASCII based encoding # 如果参数s是以ASCII编码的字符串,那么需要手动通过参数encoding指定编码方式,other than utf-8 (e.g. latin-1) then an appropriate ``encoding`` name # 不是以ASCII编码的字符串,是不被允许的,你必须把它转为unicodemust be specified. Encodings that are not ASCII based (such as UCS-2)are not allowed and should be decoded to ``unicode`` first.``object_hook`` is an optional function that will be called with the # object_hook参数是可选的,它会将(loads的)返回结果字典替换为你所指定的类型result of any object literal decode (a ``dict``). The return value of # 这个功能可以用来实现自定义解码器,如JSON-RPC``object_hook`` will be used instead of the ``dict``. This featurecan be used to implement custom decoders (e.g. JSON-RPC class hinting).``object_pairs_hook`` is an optional function that will be called with the # object_pairs_hook参数是可选的,它会将结果以key-value列表的形式返回result of any object literal decoded with an ordered list of pairs. The # 形式如:[(k1, v1), (k2, v2), (k3, v3)]return value of ``object_pairs_hook`` will be used instead of the ``dict``. # 如果object_hook和object_pairs_hook同时指定的话优先返回object_pairs_hookThis feature can be used to implement custom decoders that rely on theorder that the key and value pairs are decoded (for example,collections.OrderedDict will remember the order of insertion). If``object_hook`` is also defined, the ``object_pairs_hook`` takes priority.``parse_float``, if specified, will be called with the string # parse_float参数是可选的,它如果被指定的话,在解码json字符串的时候,of every JSON float to be decoded. By default this is equivalent to # 符合float类型的字符串将被转为你所指定的,比如说你可以指定为decimal.Decimalfloat(num_str). This can be used to use another datatype or parserfor JSON floats (e.g. decimal.Decimal).``parse_int``, if specified, will be called with the string # parse_int参数是可选的,它如果被指定的话,在解码json字符串的时候,of every JSON int to be decoded. By default this is equivalent to # 符合int类型的字符串将被转为你所指定的,比如说你可以指定为floatint(num_str). This can be used to use another datatype or parserfor JSON integers (e.g. float).``parse_constant``, if specified, will be called with one of the # parse_constant参数是可选的,它如果被指定的话,在解码json字符串的时候,following strings: -Infinity, Infinity, NaN. # 如果出现以以下字符串: -Infinity, Infinity, NaN 那么指定的parse_constant方法将会被调用到This can be used to raise an exception if invalid JSON numbersare encountered.To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` # 你也可以用cls参数通过实现一个JSONDecoder的子类,来代替JSONDecoder,通过这个功能你可以自定义上面的那些parse_xxx参数,这里就不举例了kwarg; otherwise ``JSONDecoder`` is used."""
以下参数说明是根据官方文档翻译的
3.1 s参数
把一个字符串反序列化为Python对象,这个字符串可以是str类型的,也可以是unicode
类型的,如果参数s
是以ASCII
编码的字符串,那么需要手动通过参数encoding
指定编码方式,不是以ASCII
编码的字符串,是不被允许的,你必须把它转为unicode
对于loads
方法来说,s是一个字符串,而对于load
方法来说,是一个数据流文件
3.2 object_hook参数
object_hook
参数是可选的,它会将(loads的)返回结果字典替换为你所指定的类型,这个功能可以用来实现自定义解码器,如JSON-RPC
这里先定义一个Person
对象:
class Person:def __init__(self, name, age, gender):self.name = nameself.age = ageself.gender = genderdef toJSON(self):return {"name": self.name,"age": self.age,"gender": self.gender}@staticmethoddef parseJSON(dct):if isinstance(dct, dict):p = Person(dct["name"], int(dct['age']), dct['gender'])return preturn dct
OK,试下object_hook
参数吧:
s = '{"name": "马云", "age": 54, "gender": "man"}'
# 测试json.loads方法的object_hook参数
p = json.loads(s, object_hook=Person.parseJSON)
print("json.loads 是否将字符串转为字典了: --> " + str(isinstance(p, dict)))
print("json.loads 是否将字符串转为Person对象了: --> " + str(isinstance(p, Person)))
3.3 object_pairs_hook参数
object_pairs_hook
参数是可选的,它会将结果以key-value有序列表的形式返回,形式如:[(k1, v1), (k2, v2), (k3, v3)]
,如果object_hook
和object_pairs_hook
同时指定的话优先返回object_pairs_hook
s = '{"name": "马云", "age": 54, "gender": "man"}'
# 测试json.loads方法的object_pairs_hook参数
print("-" * 30 + "> test object_pairs_hook <" + "-" * 30)
p = json.loads(s, object_hook=Person.parseJSON, object_pairs_hook=collections.OrderedDict)
# p = json.loads(s, object_hook=Person.parseJSON, object_pairs_hook=Person.parseJSON)
print("json.loads 测试同时指定object_hook和object_pairs_hook,最终调用哪个参数: --> " + str(type(p)))
print("json.loads 指定object_pairs_hook结果将会返回一个有序列表 --> {}".format(p))
3.4 parse_float参数
parse_float
参数是可选的,它如果被指定的话,在解码json
字符串的时候,符合float
类型的字符串将被转为你所指定的,比如说你可以指定为decimal.Decimal
# 测试json.loads方法的parse_float参数
print("-" * 30 + "> test parse_float <" + "-" * 30)
p = json.loads("123.456", parse_float=decimal.Decimal)
print("json.loads 通过parse_float参数将原本应该转为float类型的字符串转为decimal类型: type(json.loads(\"123.456\", parse_float=decimal.Decimal)) --> " + str(type(p)))
print("")
3.5 parse_int参数
parse_int
参数是可选的,它如果被指定的话,在解码json
字符串的时候,符合int
类型的字符串将被转为你所指定的,比如说你可以指定为float
# 测试json.loads方法的parse_int参数
print("-" * 30 + "> test parse_int <" + "-" * 30)
p = json.loads("123", parse_int=float)
print("json.loads 通过parse_int参数将原本应该转为int类型的字符串转为float类型: type(json.loads(\"123\", parse_int=float)) --> " + str(type(p)))
3.6 parse_constant参数
parse_constant
参数是可选的,它如果被指定的话,在解码json
字符串的时候,如果出现以以下字符串:-Infinity
,Infinity
,NaN
那么指定的parse_constant
方法将会被调用到
def transform(s):"""此方法作为参数传给json.load(s)方法的parse_转译NAN, -Infinity,Infinity:param s::return:"""# NaN --> not a numberif "NaN" == s:return "Not a Number"# 将负无穷大转为一个非常小的数elif "-Infinity" == s:return -999999# 将正无穷大转为一个非常大的数elif "Infinity" == s:return 999999else:return s# 测试json.loads方法的parse_constant参数
print("-" * 30 + "> test parse_constant <" + "-" * 30)
print("json.loads Infinity: --> " + str(json.loads('Infinity')))
print("json.loads parse_constant convert Infinity: --> " + str(json.loads('Infinity', parse_constant=transform_constant)))print("json.loads -Infinity: --> " + str(json.loads('-Infinity')))
print("json.loads parse_constant convert -Infinity: --> " + str(json.loads('-Infinity', parse_constant=transform_constant)))print("json.loads NaN: --> " + str(json.loads('NaN')))
print("json.loads parse_constant convert NaN : --> " + str(json.loads('NaN', parse_constant=transform_constant)))
print("")
3.7 cls参数
通过官方文档的注释我们可以知道json.load(s)
方法具体的实现是通过JSONCoder
类实现的,而cls
参数是用于自定义一个JSONCoder
的子类,用于替换JSONCoder
类,,通过这个功能你可以自定义上面的那些parse_xxx参数,这里就不举例了
Python中json模块的load/loads方法实战及参数详解相关推荐
- python跨函数调用变量_对python中不同模块(函数、类、变量)的调用详解
首先,先介绍两种引入模块的方法. 法一:将整个文件引入 import 文件名 文件名.函数名( ) / 文件名.类名 通过这个方法可以运行另外一个文件里的函数 法二:只引入某个文件中一个类/函数/变量 ...
- python中def func是什么意思_Python的函数参数详解
原标题:Python的函数参数详解 前言 Python中函数的参数可以分为两大类形参和实参~ def func(x, y): # x, y 就是形参 print(x, y) func(2, 3) # ...
- Python中Gradient Boosting Machine(GBM)方法以及调参详解
1.前言 这篇博客转载于寒小阳博主,如给博主带来不便,请联系我以便删除. 2.目录 Boosing是怎么工作的? 理解GBM模型中的参数 学会调参(附详例) 3.Boosting是如何工作的? Boo ...
- python:Json模块dumps、loads、dump、load介绍
20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...
- python中的异常分类_列举 5 个 Python 中的异常类型以及其含义【面试题详解】
今天爱分享给大家带来列举 5 个 Python 中的异常类型以及其含义[面试题详解],希望能够帮助到大家. BaseException +-- SystemExit +-- KeyboardInter ...
- python中json模块博客园_python的json模块
python的json模块 什么是序列化和反序列化? 序列化 在分布式环境下,无论是何种数据,都会以二进制序列的形式在网络上传输.序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写 ...
- python箱线图_Python 箱线图 plt.boxplot() 参数详解
Python 绘制箱线图主要用 matplotlib 库里 pyplot 模块里的 boxplot() 函数. plt.boxplot() 参数详解 plt.boxplot(x, # 指定要绘制箱线图 ...
- TL138-EVM U-Boot启动方法及启动参数详解
1U-Boot-2016.05版本适用性说明 表 1 开发板型号 是否支持本实验 TL5728-EasyEVM 支持 TL5728-IDK 支持 TL5728F-EVM 不支持 2U-Boot启动参数 ...
- python中json模块_Python使用内置json模块解析json格式数据的方法
本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...
最新文章
- layui 日历选中日期,自动填充
- 【图】IPAVS多媒体网络×××
- C# ListView 简单命令例子
- pytorch中unsqueeze()函数理解
- 鸿蒙系统打造完备终端,搭载鸿蒙系统的手机很快推出,华为生态更加完善
- 我给Apache顶级项目提了个Bug
- mysql limit 越大越慢_mysql 优化之14:php mysql limit 分页优化,页面值越大查询越慢...
- 服务器保持与Mysql的连接
- Struts中提示Invalid result location value/parameter
- 恢复win7开机动画
- 【渝粤题库】陕西师范大学164109人力资源管理 作业(高起专)
- 配置本地DNS服务器地址
- python游戏辅助lol_GitHub - skyedai910/lol-skin-spider: 30行Python代码爬取英雄联盟全英雄全皮肤...
- pathon学习日记
- 计算机网络有哪几种拓补结构,常见的五种计算机网络拓扑结构分析
- 58件女生想让男生知道的事情(男生必看)
- 物理-三菱镜-三菱镜效应:三菱镜效应 百科
- C语言找出数组中最小的数和它的下标
- 用 Python 分析资产收益的典型化事实
- CGT Asia 2023第三届亚洲细胞与基因治疗创新峰会将于4月上海召开
热门文章
- element-ui el-input “type=number“的上下箭头去掉
- 并发下线程池的最佳数量计算
- 微信小程序二手书籍交易平台系统设计与实现
- html5 幻灯片动画效果,18种响应式分层动画jQuery幻灯片特效
- 人工智能在医学领域应用的现状与展望(论文阅读04)
- 国基北盛—云计算私有云iaas(2.4)平台搭建
- 域名批量查询功能常用查询方法教程
- bit ( 比特 )和 Byte(字节)的关系以及网速怎么算?
- USACO如何提交题解
- 国内质量意识的变更过程