python 常用内置模块之 json

介绍

当处理 JSON 数据时,Python 中的 json 模块提供了四个主要的函数:dump、dumps、load 和 loads。这些函数提供了在 JSON 数据和 Python 对象之间进行转换和序列化的功能。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于将数据从一个应用程序传输到另一个应用程序。它基于 JavaScript 语言的一个子集,但已成为跨编程语言和平台的通用数据格式。

JSON 数据由键值对组成,类似于 Python 中的字典或 JavaScript 中的对象。它支持以下数据类型:

  • 字符串(String):表示文本数据,使用双引号括起来。
  • 数字(Number):表示整数或浮点数。
  • 布尔值(Boolean):表示真或假。
  • 数组(Array):表示有序的值列表,使用方括号括起来,值之间用逗号分隔。
  • 对象(Object):表示键值对集合,使用花括号括起来,键和值之间用冒号分隔,键值对之间用逗号分隔。

常用 API

  • **loads() **:将 JSON 字符串解析为 Python 对象。

    注意:

    • 在使用 loads 的时候 json 中的字符串必须要用双引号,否则会报错(json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 12))
    • 入参不能为 None,否则报错
  • dumps() : 将 Python 对象转换为为 JSON 字符串

    参数:

    • obj(必需):要编码为 JSON 格式的 Python 数据结构。这可以是字典、列表、整数、字符串等等。

    • ensure_ascii(可选):默认为 True。

      • 如果将其设置为 True,则会确保生成的 JSON 字符串中的所有非 ASCII 字符都会被转义为 Unicode 转义序列(例如 \uXXXX),以便在输出时保持 ASCII 字符集。
      • 如果将其设置为 False,则非 ASCII 字符将以原始形式保留在输出中。
    • indent(可选):用于指定生成的 JSON 字符串的缩进级别。如果设置为一个整数,将在生成的 JSON 字符串中包含缩进,使其更易于阅读。

    • skipkeys(可选):默认为 False。如果将其设置为 True,则会跳过那些字典键不是基本数据类型(str, int, float, bool, NoneType)的项。如果字典中包含非基本数据类型的键,将会引发 TypeError。

    • check_circular(可选):默认为 True。

      • 如果将其设置为 True,则会检查循环引用并引发 ValueError。
      • 如果将其设置为 False,则不会检查循环引用。
    • allow_nan(可选):默认为 True。

      • 如果将其设置为 True,则允许编码浮点数值为特殊值(如 NaN 和 Infinity),这符合 JSON 规范。
      • 如果将其设置为 False,则将 NaN 和 Infinity 视为无效输入,并引发 ValueError。
    • cls(可选):用于指定自定义 JSON 编码器的类。默认为 None,表示使用标准的 JSON 编码器。

    • separators(可选):用于指定生成的 JSON 字符串中的分隔符。

      默认为 (", "": "),表示键值对之间使用逗号和冒号分隔。可以根据需要自定义分隔符。

    import jsonstr = '''[{"name":"AnJing","age":"26"
    }]
    '''
    data = json.loads(str)
    print(data)				# 输出:[{'name': 'AnJing', 'age': '26'}]
    print(type(data))		# 输出:<class 'list'>
    print(data[0].get('name'))		# 输出:AnJing
    print(data[0]['name'])  		# 通过下标进行选择str_data = json.dumps(data)
    print(type(data))			# 输出:<class 'str'>
    print(data)					# 输出:[{"name": "AnJing", "age": "26"}]
    
  • load() :从 JSON 文件中读取数据,并将其解析为 Python 对象。

    它接受一个参数:要读取的文件对象。

  • dump() :将 Python 对象转换为 JSON 数据,并将其写入文件对象中

    它接受两个参数:要序列化的对象和目标文件对象

    注意:在使用 dump 和 load 函数时,需要提供文件对象并确保文件以适当的模式打开(如 ‘w’ 用于写入,‘r’ 用于读取)

    import jsonstr = [{"name":"AnJing","age":"26"
    }]
    # 通过dump写入到文件中
    json.dump(str, open('123.json','w'))
    # 通过load查看是否写入
    data = json.load(open('123.json','r'))
    print(data)			# 输出:[{'name': 'AnJing', 'age': '26'}]
    

常见报错

  • 解析无效的 JSON 字符串

    如果提供的 JSON 数据无效,解析过程将引发 JSONDecodeError 异常。

    例如:

    • 缺少引号

      invalid_json = '{"name": "ZhangSan", age: 30, "city": "ShenZhen"}'
      data = json.loads(invalid_json) 
      # 引发JSONDecodeError异常。原因为JSON字符串中的age缺少双引号,导致解析失败
      
    • 不符合 JSON 语法规则(JSON 数据内字符串必须使用双引号)

  • 解析无效属性的字符串

    如果方法入参为 None 或空字符串灯,解析过程将引发 AttributeError 错误

  • 访问不存在的键

    如果尝试访问 JSON 数据中不存在的键,将引发 KeyError 异常。

    print(data['address'])  # 引发KeyError异常。原因为JSON数据中没有address键,访问该键将引发异常
    

获取对象去除为 null 的字段的 json 字符串

  • 要将一个包含基本模型的对象转换为 JSON 并去除其中的 null 字段,可以使用 Python 中的 json 模块和一个递归函数来完成这个任务。

  • 示例代码

    import jsondef remove_null(obj):if isinstance(obj, dict):return {key: remove_null(value) for key, value in obj.items() if value is not None}elif isinstance(obj, list):return [remove_null(item) for item in obj if item is not None]else:return obj# 示例对象,包含了一些 None 值
    data = {"name": "John","age": None,"address": {"street": "123 Main St","city": None,"zip_code": "98765"},"hobbies": ["reading", None, "swimming"]
    }
    # 使用 remove_null 函数去除 None 值
    data_without_null: dict = remove_null(data)
    # 将处理后的对象转换为 JSON 格式
    json_data = json.dumps(data_without_null)# 注意:继承自pydantic的BaseModel类的类,若有字段的类型也是BaseModel,需先转json再转dict,再传入函数
    json_data = json.dumps(remove_null(json.loads(base_model.josn())))
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS 功能包

ROS 功能包是 ROS 的核心组成部分之一&#xff0c;它是一个包含了源代码、配置文件、脚本等元素的一个单独的目录结构&#xff0c;用来实现特定功能。每个 ROS 功能包都有一些共同的文件&#xff0c;如 package.xml 文件&#xff0c;CMakeLists.txt 文件等&#xff0c;用于描述…

Redis Lua沙盒绕过 命令执行(CVE-2022-0543)漏洞复现

Redis Lua沙盒绕过 命令执行(CVE-2022-0543)漏洞复现 Redis如果在没有开启认证的情况下&#xff0c;可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。–那么这也就是redis未授权访问了 Redis的默认端口是6379 可以用空间测绘搜索&#xff…

【青蛙跳台阶问题 —— (三种算法)】

青蛙跳台阶问题 —— (三种算法&#xff09; 一.题目介绍1.1.题目1.2.图示 二.解题思路三.题解及其相关算法3.1.递归分治法3.2.动态规划算法&#xff08;Dynamic Programming&#xff09;3.3.斐波那契数列法 四.注意细节 一.题目介绍 1.1.题目 一只青蛙一次可以跳上1级台阶&am…

GWAS 分析模型 | FaST-LMM

GWAS 分析模型 | FaST-LMM FaST-LMM (Factored Spectrally Transformed Linear Mixed Models) 是一个用于进行全基因组关联分析&#xff08;GWAS&#xff09;的模型。与标准混合线性模型相比&#xff0c;FaST-LMM 通过对遗传相似性矩阵进行单次谱分解来减少计算资源消耗并提升运…

超全超实用行业解决方案合集,覆盖十大行业数据应用需求

现代企业面对复杂的业务需求&#xff0c;对数据分析的需求日益增加。 从实时销售到市场趋势&#xff0c;从客户行为到产品优化&#xff0c;每个环节都依赖于数据支持。然而&#xff0c;传统的数据分析平台常分散在不同系统和团队中&#xff0c;形成数据孤岛&#xff0c;降低了…

企业如何保障跨境金融业务中的数据安全传输?

随着全球化的不断深入&#xff0c;跨境金融业务日益频繁&#xff0c;然而在这些业务中&#xff0c;数据的安全传输一直是企业面临的重大挑战。跨境业务数据传输可能会遇到多种困难&#xff0c;如网络攻击、数据泄露、通信故障等。因此&#xff0c;企业需要采取有效的措施来确保…

C#,《小白学程序》第二十二课:大数的乘法(BigInteger Multiply)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

漏洞复现--致远 M3 反序列化 mobile_portal RCE

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

JS根据颜色值和透明度获取带透明度的背景

在设置背景的时候&#xff0c;有时需要先选颜色值&#xff0c;然后再调整透明度&#xff0c;但却又不能影响文字透明度(功能类似简单封面EasyCover (jiandan.link))&#xff0c;此时可以将颜色值&#xff08;线性颜色或者十六进制颜色&#xff09;和透明度作为参数&#xff0c;…

数据结构 / 结构体位域

结构体位域充分利用把结构体字节&#xff0c;以bite为单位。例如:存储性别&#xff0c;可以使用二进制0或1表示 1. 格式 struct 结构体位域名 { 数据类型 位域名:位域大小; ...... }; 结构体位域名:满足命名规范数据类型&#xff1a;不可…

AIGC系列之:DDPM原理解读(简单易懂版)

目录 DDPM基本原理 DDPM中的Unet模块 Unet模块介绍 Unet流程示意图 DownBlock和UpBlock MiddleBlock 文生图模型的一般公式 总结 本文部分内容参考文章&#xff1a;https://juejin.cn/post/7251391372394053691&#xff0c;https://zhuanlan.zhihu.com/p/563661713&…

03 项目运行

前面两篇文章对项目架构+源码架构做了分析,这篇文章先将服务部署一下,能够让大家有个直观的感受。 组件资源 项目运行的各种组件已经为你准备好了,有需要的直接百度云盘下载: 链接:https://pan.baidu.com/s/1hN6qf20gamMHPmA_qXwsLg提取码:o4k9MySQL数据库创建 找到的…

2023年最新Dev-C++下载安装以及C语言环境搭建教程(C语言入门)

文章目录 写在前面C语言简介Dev-C简介Dev-C下载安装Dev-C使用教程 写在后面 写在前面 2023年最新Dev-C下载安装以及C语言环境搭建教程&#xff0c;快来看看吧&#xff01; C语言简介 C语言是一种通用的高级程序设计语言&#xff0c;由美国计算机科学家Dennis Ritchie于20世纪…

51单片机的智能窗帘系统【含proteus仿真+程序+报告+原理图】

1、主要功能 该系统由AT89C51单片机LCD1602显示模块DS18B20温度模块DS1302时间模块光敏传感器步进电机蓝牙等模块构成。适用于智能窗帘、智能门窗家具等相似项目。 可实现基本功能: 版本一&#xff1a; 1、LCD1602实时显示北京时间、环境温度、光照强度、手动/自动控制等信息…

什么是磁矩?磁矩与磁通的关系

物质的磁性来源于原子中的电子磁矩 物质由原子构成&#xff0c;而原子是由原子核和电子组成的。在原子中&#xff0c;电子因绕原子核运动而具有轨道磁矩&#xff1b;电子因自旋具有自旋磁矩&#xff0c;原子的磁矩主要来源于电子磁矩&#xff0c;这是一切物质磁性的来源。 磁…

Golang 设置运行的cpu数与channel管道

介绍&#xff1a;为了充分了利用多cpu的优势&#xff0c;在Golang程序中&#xff0c;设置运行的cpu数目。 func main() {//获取系统当前cpu的数量num : runtime.NumCPU()//这里根据需求来设置整个go程序去使用几个cpuruntime.GOMAXPROCS(num)fmt.Println("num ", nu…

kafka集群环境部署

文章目录 1 Kafka集群2 搭建两台服务器2.1 zookeeper部署2.2 启动1号机器的broker2.3 启动2号机器的broker2.4 查看kafka集群2.5 测试集群 1 Kafka集群 2 搭建两台服务器 2.1 zookeeper部署 zookeeper先只部署一台&#xff0c;在1号机器&#xff08;192.168.11.59&#xff09;…

图解系列--Http

1.URI和URL 1.1.URL URL是统一资源定位符。URL正是使用 Web 浏览器等访问 Web 页面时需要输入的网页地址。比如&#xff0c;http://hackr.jp/就是 URL。 1.2.URI 统一资源标识符。 URI 用字符串标识某一互联网资源&#xff0c;而URL表示资源的地点&#xff08;互联网上所处的位…

C语言标准

1、概述 C语言标准是由ANSI&#xff08;美国国家标准协会&#xff09;和ISO&#xff08;国际标准化组织&#xff09;共同制定的一种语言规范。标准经历过如下更新&#xff1a; C89/C90标准C99标准C11标准C17标准 2、C89/C90标准 (1)这是1989年正式发布的C语言标准&#xff0…

windows下cef源码下载和编译

脚本源码:GitHub - sway913/cef_build: build cef source 1、源码下载 2、编译 3、遇到的问题 1、RuntimeError: requested profile "D:\code\chromium_git\chromium\src\chrome\build\pgo_profiles\chrome-win64-5414-1673458358-5348276ff887eb95bb837c1dd06e9efed673b…