Python中json模块的load/loads方法实战及参数详解

Python中json模块的load/loads方法实战及参数详解前言适用于 python2 和 python3 正文在 Python 中 json 是一个非常常用的模块 这个主要有 4 个方法 json dumpsjson dumpjson loadsjson load 这里主要分析讲解一下 json 的 loads 和 load 方法 这两个方法中都是把其他类型的对象转为 Python 对象 其中 loads 方法是把字符串转为 Python 对象 load 方法是把文件内容转

前言

适用于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)) 

Python中json模块的loads和load方法实战详解_01

2. 转换成Python对象

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

日常工作中最常见的就是把字符串通过json.loads转为字典,其实json的loads方法不仅可以把字符串转为字典,还可以转为任何Python对象。
比如说,转成python基本数据类型:

print('json.loads 将整数类型的字符串转为int类型: type(json.loads(""))) --> {}'.format(type(json.loads("")))) 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"}')))) 

Python中json模块的loads和load方法实战详解_02json模块会根据你的字符串自动转为最符合的数据类型,
但是需要注意的是不能把转为字符串,否则会报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编码的字符串,是不被允许的,你必须把它转为unicode must 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 feature can 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_hook This feature can be used to implement custom decoders that rely on the order 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.Decimal float(num_str). This can be used to use another datatype or parser for 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类型的字符串将被转为你所指定的,比如说你可以指定为float int(num_str). This can be used to use another datatype or parser for 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 numbers are 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 = name self.age = age self.gender = gender def toJSON(self): return { 
    "name": self.name, "age": self.age, "gender": self.gender } @staticmethod def parseJSON(dct): if isinstance(dct, dict): p = Person(dct["name"], int(dct['age']), dct['gender']) return p return 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))) 

Python中json模块的loads和load方法实战详解_05

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)) 

Python中json模块的loads和load方法实战详解_06

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("") 

Python中json模块的loads和load方法实战详解_07

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))) 

Python中json模块的loads和load方法实战详解_08

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 number if "NaN" == s: return "Not a Number" # 将负无穷大转为一个非常小的数 elif "-Infinity" == s: return - # 将正无穷大转为一个非常大的数 elif "Infinity" == s: return  else: 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("") 

Python中json模块的loads和load方法实战详解_09

3.7 cls参数

通过官方文档的注释我们可以知道json.load(s)方法具体的实现是通过JSONCoder类实现的,而cls参数是用于自定义一个JSONCoder的子类,用于替换JSONCoder类,,通过这个功能你可以自定义上面的那些parse_xxx参数,这里就不举例了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201283.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:41
下一篇 2026年3月20日 上午9:41


相关推荐

  • 讯飞星火X1升级突破,推理性能比肩全球一流水平

    讯飞星火X1升级突破,推理性能比肩全球一流水平

    2026年3月14日
    2
  • 什么是GMM算法_bs模型公式

    什么是GMM算法_bs模型公式1.高斯模型与高维高斯模型介绍高斯模型也就是正态分布模型,该模型最早可见于我们的高中数学教材中。闻其名知其意,正态分布是自然界中普遍存在的一种分布。比如,考试成绩,人的智力水平等等。都是大致呈现为正态分布。其概率密度函数为其中参数为μ,σ2,都是一维标量。对于高维高斯模型,与一维类似,只是自变量变成了多维,是一个向量。其概率密度函数为其中参数为μ…

    2025年6月6日
    4
  • IDea2022.01.12激活码[最新免费获取]2022.02.06[通俗易懂]

    (IDea2022.01.12激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~4KDDGND3CI-eyJsaWNlb…

    2022年4月1日
    47
  • leetcode, LC5: insertion-sort-list[通俗易懂]

    leetcode, LC5: insertion-sort-list[通俗易懂]题目描述使用插入排序对链表进行排序。Sortalinkedlistusinginsertionsort.示例1输入{3,2,4}输出{2,3,4}解题思路new一个新的ListNode作为选择排序好的链表的表头对于原始链表中的每一个结点2.1.寻找新链表中该结点的插入位置2.2插入该结点返回新链表代码实现/***structListNode{* intval;* structListNode*next;

    2022年7月24日
    9
  • 超分辨率重建 matlab,基于Matlab的多图像超分辨率重建算法

    【实例简介】多图像超分辨率的实现主要就是将具有相似而又不同却又互相补充信息的配准影像融到一起,得到非均匀采样的较高分辨率数据,复原需要亚像素精度的运动矢量场,然而它们之间的运动模型估计精确与否直接影响到重建的效果,因此影像配准和运动模型的估计精度是高分辨率图像重建的关键。由于实际中不同时刻获得的影像数据间存在较大的变形、缩放、旋转和平移,因此必须对其进行配准,在此基础上进行运动模型估计。然后通过频…

    2022年4月9日
    103
  • python中批量缩进_pycharm中实现多行批量缩进的快捷键是什么

    python中批量缩进_pycharm中实现多行批量缩进的快捷键是什么pycharm 中实现多行批量缩进的快捷键是什么发布时间 2021 01 1517 19 26 来源 亿速云阅读 71 作者 Leahpycharm 中实现多行批量缩进的快捷键是什么 很多新手对此不是很清楚 为了帮助大家解决这个难题 下面小编将为大家详细讲解 有这方面需求的人可以来学习下 希望你能有所收获 在 VS PYCHARM 中只要拉选块之后 按下 tab 键 整个块就会缩进 按下 shift

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号