文章目录

  • 前言
  • 正文
    • 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个方法:

  1. json.dumps
  2. json.dump
  3. json.loads
  4. json.load

这里主要分析讲解一下json的loadsload方法。
这两个方法中都是把其他类型的对象转为Python对象,这里先说明一下Python对象,
Python对象包括:
所有Python基本数据类型,列表,元组,字典,自己定义的类,等等等等,当然不包括Python的字符串类型,把字符串或者文件鎏中的字符串转为字符串会报错的

1.1不相同点:

  1. loads操作的是字符串
  2. load操作的是文件流

1.2 相同点

  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对象

由于loadsload两个方法只是处理的数据源不同,其他的参数都是相同的,返回的结果类型也相同,故这是loadsload方法两个只说一个,

日常工作中最常见的就是把字符串通过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_hookobject_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字符串的时候,如果出现以以下字符串:-InfinityInfinityNaN那么指定的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方法实战及参数详解相关推荐

  1. python跨函数调用变量_对python中不同模块(函数、类、变量)的调用详解

    首先,先介绍两种引入模块的方法. 法一:将整个文件引入 import 文件名 文件名.函数名( ) / 文件名.类名 通过这个方法可以运行另外一个文件里的函数 法二:只引入某个文件中一个类/函数/变量 ...

  2. python中def func是什么意思_Python的函数参数详解

    原标题:Python的函数参数详解 前言 Python中函数的参数可以分为两大类形参和实参~ def func(x, y): # x, y 就是形参 print(x, y) func(2, 3) # ...

  3. Python中Gradient Boosting Machine(GBM)方法以及调参详解

    1.前言 这篇博客转载于寒小阳博主,如给博主带来不便,请联系我以便删除. 2.目录 Boosing是怎么工作的? 理解GBM模型中的参数 学会调参(附详例) 3.Boosting是如何工作的? Boo ...

  4. python:Json模块dumps、loads、dump、load介绍

    20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...

  5. python中的异常分类_列举 5 个 Python 中的异常类型以及其含义【面试题详解】

    今天爱分享给大家带来列举 5 个 Python 中的异常类型以及其含义[面试题详解],希望能够帮助到大家. BaseException +-- SystemExit +-- KeyboardInter ...

  6. python中json模块博客园_python的json模块

    python的json模块 什么是序列化和反序列化? 序列化 在分布式环境下,无论是何种数据,都会以二进制序列的形式在网络上传输.序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写 ...

  7. python箱线图_Python 箱线图 plt.boxplot() 参数详解

    Python 绘制箱线图主要用 matplotlib 库里 pyplot 模块里的 boxplot() 函数. plt.boxplot() 参数详解 plt.boxplot(x, # 指定要绘制箱线图 ...

  8. TL138-EVM U-Boot启动方法及启动参数详解

    1U-Boot-2016.05版本适用性说明 表 1 开发板型号 是否支持本实验 TL5728-EasyEVM 支持 TL5728-IDK 支持 TL5728F-EVM 不支持 2U-Boot启动参数 ...

  9. python中json模块_Python使用内置json模块解析json格式数据的方法

    本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...

最新文章

  1. layui 日历选中日期,自动填充
  2. 【图】IPAVS多媒体网络×××
  3. C# ListView 简单命令例子
  4. pytorch中unsqueeze()函数理解
  5. 鸿蒙系统打造完备终端,搭载鸿蒙系统的手机很快推出,华为生态更加完善
  6. 我给Apache顶级项目提了个Bug
  7. mysql limit 越大越慢_mysql 优化之14:php mysql limit 分页优化,页面值越大查询越慢...
  8. 服务器保持与Mysql的连接
  9. Struts中提示Invalid result location value/parameter
  10. 恢复win7开机动画
  11. 【渝粤题库】陕西师范大学164109人力资源管理 作业(高起专)
  12. 配置本地DNS服务器地址
  13. python游戏辅助lol_GitHub - skyedai910/lol-skin-spider: 30行Python代码爬取英雄联盟全英雄全皮肤...
  14. pathon学习日记
  15. 计算机网络有哪几种拓补结构,常见的五种计算机网络拓扑结构分析
  16. 58件女生想让男生知道的事情(男生必看)
  17. 物理-三菱镜-三菱镜效应:三菱镜效应 百科
  18. C语言找出数组中最小的数和它的下标
  19. 用 Python 分析资产收益的典型化事实
  20. CGT Asia 2023第三届亚洲细胞与基因治疗创新峰会将于4月上海召开

热门文章

  1. element-ui el-input “type=number“的上下箭头去掉
  2. 并发下线程池的最佳数量计算
  3. 微信小程序二手书籍交易平台系统设计与实现
  4. html5 幻灯片动画效果,18种响应式分层动画jQuery幻灯片特效
  5. 人工智能在医学领域应用的现状与展望(论文阅读04)
  6. 国基北盛—云计算私有云iaas(2.4)平台搭建
  7. 域名批量查询功能常用查询方法教程
  8. bit ( 比特 )和 Byte(字节)的关系以及网速怎么算?
  9. USACO如何提交题解
  10. 国内质量意识的变更过程