python中的json模块常用方法汇总

 更新时间:2022年06月06日 10:43:32   作者:安一缸  
这篇文章主要介绍了python中的json模块常用方法汇总,json模块可以实现json数据的序列化和反序列化,更多相关资料介绍需要的小伙伴可以参考一下下面文章内容

一、概述

推荐使用参考网站: 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)

到此这篇关于python中的json模块常用方法汇总的文章就介绍到这了,更多相关python json模块 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python matplotlib plotly绘制图表详解

    Python matplotlib plotly绘制图表详解

    plotly本身是个生态非常复杂的绘图工具,它对很多编程语言提供接口。交互式和美观易用应该是 Plotly 最大的优势,而 Matplotlib 的特点则是可定制化程度高,但语法也相对难学,各有优缺点。本文将通过示例详细讲解二者是如何绘制图表的,需要的可以参考一下
    2022-03-03
  • Python计算双重差分模型DID及其对应P值使用详解

    Python计算双重差分模型DID及其对应P值使用详解

    这篇文章主要介绍了Python计算DID及其对应P值的使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-09-09
  • python如何生成textgrid文件

    python如何生成textgrid文件

    这篇文章主要介绍了python如何生成textgrid文件,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Python字典和列表性能之间的比较

    Python字典和列表性能之间的比较

    今天给大家介绍的是Python列表和字典的相关知识,文中对Python字典和列表的性能作了充分的比较,好奇的小伙伴们一起来看看吧,需要的朋友可以参考下
    2021-06-06
  • 基于python编写的shell脚本详细讲解

    基于python编写的shell脚本详细讲解

    python相对于linux的shell脚本来说更简单,功能更强大,代码量也少很多,这里就为大家分享一下
    2021-09-09
  • 利用pandas进行数据清洗的7种方式

    利用pandas进行数据清洗的7种方式

    采集到原始的数据中会存在一些噪点数据,噪点数据是对分析无意义或者对分析起到偏执作用的数据,所以这篇文章给大家介绍了利用pandas进行数据清洗的7种方式,需要的朋友可以参考下
    2024-03-03
  • 详解Python中xlwt库的基本操作

    详解Python中xlwt库的基本操作

    xlwt 是一个用于在Python中操作Excel文件的库,它允许用户创建、修改和写入Excel文件,本文主要为大家介绍了xlwt库的一些基本操作,需要的可以参考一下
    2023-11-11
  • python 的生产者和消费者模式

    python 的生产者和消费者模式

    这篇文章主要介绍了python 的生产者和python 的消费者模式的具体相关资料,需要的朋友可以参考下面文章内容
    2021-09-09
  • 使用Python webdriver图书馆抢座自动预约的正确方法

    使用Python webdriver图书馆抢座自动预约的正确方法

    这篇文章主要介绍了使用Python webdriver图书馆抢座自动预约的正确方法,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Python中数值比较的效率

    Python中数值比较的效率

    这篇文章主要介绍了Python中数值比较的效率,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01

最新评论