python之json模块常用方法介绍

2023-11-06


推荐使用参考网站: 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):
  1. 把obj序列化成一个json格式的字符串,并返回该字符串
    支持的python内置可进行json序列化的类型有(str, int, float, bool, Nonelisttupledict)
    如果无法序列化的类型,会抛出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)

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python之json模块常用方法介绍 的相关文章

  • 搜索/替换 xml 内容

    我已经成功地使用 xml etree ElementTree 解析 xml 搜索内容 然后将其写入不同的 xml 然而 我只是处理单个标签内的文本 import os sys glob xml etree ElementTree as ET
  • 如何在嵌套列表中查找给定元素?

    这是我的迭代解决方案 def exists key arg if not arg return False else for element in arg if isinstance element list for i in elemen
  • 为什么Flask后台线程获取错误的数据库信息?

    为了将实时数据库信息推送到客户端 我在服务器端使用flask socketio 通过使用websocket将所有实时数据库信息推送到客户端 我的视图文件有一个片段 from models import Host from flask soc
  • python 函数 *args 和 **kwargs 以及其他指定的关键字参数

    我有一个 Python 类 它的方法应该以这种方式接受参数和关键字参数 class plot def init self x y self x x self y y def set axis self args xlabel x ylabe
  • 使用 java.util.Set 时的 Jackson bug(或功能!?) - mySet.size() 始终为 1

    我正在使用 Jackson 2 2 0 和 Spring 3 2 0 以及 Hibernate 4 2 2 我最近不得不通过 POST 向服务器发送一组对象 cancelationDate 2013 06 05 positions pric
  • 在 json 对象中执行 javascript 代码?

    有远吗 所以像这样 key1 val1 key2 val2 some code document getElementById someid innerHTML test 那么 some code 会在没有任何用户干预的情况下执行吗 No
  • 为什么 scikit-learn SVM.SVC() 非常慢?

    我尝试使用SVM分类器来训练大约10万个样本的数据 但我发现它非常慢 甚至两个小时后也没有任何反应 当数据集有大约 1k 个样本时 我可以立即得到结果 我还尝试了 SGDClassifier 和朴素贝叶斯 速度相当快 几分钟内就得到了结果
  • 为什么我的字符串中出现不需要的换行符?

    这应该很简单 这很愚蠢 但我无法让它发挥作用 我有一个在读取文件时定义的标头 if gene env in line or gene HIV2gp7 in line header line 现在这个标题看起来像 gt lcl NC 0018
  • Python 中没有名称属性的表单提交

    背景 在Python中使用urllib和urllib2 您可以进行表单提交 您首先创建一个字典 formdictionary search stackoverflow 然后使用 urllib 的 urlencode 方法来转换这个字典 pa
  • 将列表列表替换为“压缩”列表列表,同时保持顺序

    我有一个列表列表 如我所附的代码所示 如果有任何共同值 我想链接每个子列表 然后我想用列表的精简列表替换列表的列表 例子 如果我有一个清单 1 2 3 3 4 I want 1 2 3 4 如果我有 4 3 1 2 3 I want 4 3
  • dask分布式内存错误

    在分布式作业上运行 Dask 时 我在调度程序上遇到以下错误 distributed core ERROR Traceback most recent call last File usr local lib python3 4 dist
  • pip 升级到 pip 10.x.x 后解析需求文件的正确方法?

    所以今天我确实发现随着发布pip 10 x x the req软件包更改了其目录 现在可以在下面找到pip internal req 由于通常的做法是使用parse requirements功能在你的setup py从需求文件中安装所有依赖
  • Python httplib 和 POST

    我目前正在使用别人编写的一段代码 它用httplib向服务器发出请求 它以正确的格式提供所有数据 例如消息正文 标头值等 问题是 每次尝试发送 POST 请求时 数据都在那里 我可以在客户端看到它 但没有任何内容到达服务器 我已经阅读了库规
  • 从Python列表中挑选出具有特定索引的项目

    我确信在 Python 中有一种很好的方法可以做到这一点 但我对这门语言还很陌生 所以如果这是一个简单的方法 请原谅我 我有一个列表 我想从该列表中挑选某些值 我想要挑选的值是列表中索引在另一个列表中指定的值 例如 indexes 2 4
  • matplotlib 后端 - 我关心吗?

    gt gt gt import matplotlib gt gt gt print matplotlib rcsetup all backends u GTK u GTKAgg u GTKCairo u MacOSX u Qt4Agg u
  • 如何让 Python 生成器返回 None 而不是 StopIteration?

    我使用生成器在列表中执行搜索 如下简单示例 gt gt gt a 1 2 3 4 gt gt gt i for i v in enumerate a if v 4 next 3 只是为了稍微说明一下示例 与上面的列表相比 我使用的列表要长得
  • Javascript - 通过键获取特定 JSON 数组元素内的属性值

    我有一个像这样的 JSON 结构 map key1 valueA1 key2 valueA2 key3 valueA3 key1 valueB1 key2 valueB2 key3 valueB3 key1 valueC1 key2 val
  • 将json数据从servlet传递到jsp到js文件

    我得到了这个创建 JSON 数据的 servlet 我想将此数据传递到一个 jsp 页面 该页面应该通过 InfoVis 工具包显示数据 servlet java JSONObject json new JSONObject JSONArr
  • 如何限制单元测试的最大运行时间?

    我目前正在运行一些单元测试 这些测试可能需要很长时间才能失败或无限期地运行 在成功的测试运行中 它们总是会在一定的时间内完成 是否可以创建一个 pytest 单元测试 如果在一定时间内未完成 该测试就会失败 您可以安装 pytest tim
  • 合并共享属性的节点

    EDITED 我真的需要 Networkx graph 专家的帮助 假设我有以下数据框 我想将这些数据框转换为图表 然后我想根据描述和优先级属性将两个图映射到相应的节点 df1 From description To priority 10

随机推荐

  • 如何用计算机发匿名短信,电脑如何给手机发信息_电脑匿名给手机发短信

    2017 01 09 08 24 27 腾讯应用宝 手机和电脑都安装好应用宝后 手机打开USB调试模式 电脑运行应用宝 无线连接手机后 就可以在电脑上发手机信息了 不过信息费扣的是你手机卡上的 无非就是借用电脑的键盘打字 2017 01 1
  • anaconda中如何安装tflearn?

    1 打开anaconda prompt 2 activate tensorflow 环境名 3 pip install tflearn 4 如何安装tflearn
  • element-ui二次封装(下拉菜单el-dropdown)

    样式效果 效果1 效果2 效果1组件调用
  • 如何查看中科院2020期刊分区表?

    如何查看中科院2020期刊分区表 2020年中国科学院文献情报中心期刊分区表 以下简称基础版分区表 正式发布 2020年基础版分区表在秉承方法科学和数据客观的基础上 延续使用2019年基础版分区表的方法体系 2020基础版分区表继续突出支持
  • vue怎么引入环境变量_vue 文件中如何获取环境变量

    环境变量的传递路径 命令行命令 gt Webpack gt Webpack 加载的各种 js 和 Vue 文件 你的 nodejs 运行命令启动项目 package json dev cross env BABEL ENV developm
  • Python 日期时间datetime 加一天,减一天,加减一小时一分钟

    当前日期时间 import datetime print datetime datetime now 2018 05 08 16 53 30 101000 1 2 3 格式化时间 import datetime print datetime
  • FPGA零基础学习之Vivado-数码管驱动设计实验

    FPGA零基础学习之Vivado 数码管驱动设计实验 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业开发
  • 【目标检测】

    test coco py cal area import os import pickle import cv2 import matplotlib pyplot as plt import numpy as np from pathlib
  • [转]回文串判断算法——Manacher算法

    以下文字转自 ddyyxx博客 Manacher算法总结 Manacher算法总结 算法总结第三弹 manacher算法 前面讲了两个字符串相算法 kmp和拓展kmp 这次来还是来总结一个字符串算法 manacher算法 我习惯叫他 马拉车
  • 【allegro 17.4软件操作保姆级教程三】布局操作基础一

    个人主页 highman110 作者简介 一名硬件工程师 持续学习 不断记录 保持思考 输出干货内容 目录 1原理图PCB交互操作 2飞线处理方式 3器件移动 旋转 镜像 对齐 3 1移动 3 2旋转 3 3镜像 3 4对齐 1原理图PCB
  • intellij idea vue js 报ESLint: Expected indentation of 0 spaces but found 2. (indent)错误解决方法

    ESLint这东西是真的烦 把人当做机器来验证 没办法 遇到他了 死磕 就因为script后面的内容被idea格式化之后空了两格 这就不得了了 你一个警告 总是搞一个error的标志 难道不知道程序员最忌讳的就是打断吗 你要求严格 也不能这
  • log4j好文记录

    log4j2使用filter过滤日志 log4j2使用filter过滤日志 log4j2 filter justry deng的博客 CSDN博客笔者语录 近一段时间感情 事业 家庭都挺闹心 感觉走到人生的转折点了 刚开始以为必须有所舍弃才
  • Matlab画常见的信号函数二

    一 Sa函数 功能 产生Sinc或sin pi t pi t 函数波形 格式 y sinc x 代码如下 x linspace 5 5 y sinc x plot x y 结果如下 二 调频余弦信号 功能 产生调频余弦信号 格式 y chi
  • 电子企业MES管理系统案例分享,提升效率与质量

    随着电子技术的迅速发展 电子企业面临着越来越多的挑战 传统的生产管理方式已经无法满足复杂的生产需求 无法有效地协调生产线的运作 并且对物料管理和质量控制的要求越来越高 为了解决这些问题 越来越多的电子企业开始引入MES管理系统解决方案 以提
  • org.apache.maven.plugins:maven-compiler-plugin not found 问题解决

    情况是这样的 我刚换了新的笔记本电脑 把以往的maven项目导入到IDEA中 公司网络环境不好 网速慢 出现了这个问题 网上的帖子 https blog csdn net yinbaicheng article details 819450
  • 通过接口获取到的json数据如何修改请求头_自动化接口测试HttpRunner(二)浅讲解...

    接上一篇httprunner 进入实战 搭建脚手架 hrun startproject demo 今天以某信的API文档为例 进行简单的接口测试框架应用 官方api文档地址有需要请关注后私聊 这里简单展示两个接口文档 获取token的接口文
  • [C语言]常量、变量

    1 变量 1 1变量的定义 格式 数据类型 变量名 最好定义变量后给予他一个初始值 0 eg int a int age 18 char name XiaoMing float sum 2 5 1 2 变量的命名 只能由字母 包括大小写 数
  • OpenCV中的特征匹配+单应性以查找对象

    OpenCV中的特征匹配 单应性以查找对象 1 效果图 2 源码 参考 这篇博客将混合calib3d模块中的特征匹配和单应性 在复杂图像中查找已知对象 1 效果图 特征匹配 单应性查找对象效果图如下 2 源码 在图像中找到SIFT特征并应用
  • 密码学与网络安全—知识点总结

    前言 本文为期末考试后结合一些资料整理完成的 涵盖山东大学软件学院信息安全导论的课程主要内容 参考书为 密码编码学与网络安全 我列居了81个名词概念 31道经典问答题 先附上所有知识点的word版与pdf版 并添加了目录 方便复习 电子版下
  • python之json模块常用方法介绍

    文章目录 一 概述 二 方法详解 1 dump 2 dumps 3 load 4 loads 三 代码实战 1 dumps 2 dump 3 load 4 loads 推荐使用参考网站 json 一 概述 在python中 json模块可以