详解Python中的json库
目录
- 1. json简介
- 2. dumps/loads
- 3. dump/load
- 4. jsonl格式
1. json简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于在不同应用程序之间传递数据。它是一种文本格式,易于阅读和编写,同时也易于解析和生成。JSON最初是由Douglas Crockford于2001年提出的,它基于JavaScript对象字面量语法,但已经成为一种独立于编程语言的数据格式。
乍一看json对象和python中的字典长得差不多,但前者是一种数据格式,而后者是一种数据结构。
具体来讲,json对象由一个大括号 {} 组成,大括号里保存的是若干个key-value对,其中key必须是字符串,且必须由双引号括起来(python的字典可以是单引号)。value可以是字符串,数值(整数/浮点数),布尔值,null,数组,json对象。key和value使用冒号 : 进行分隔,每个key-value对使用逗号 , 进行分隔。
json对象通常存储在以 .json 为扩展名的文本文件中,一个可能的例子:
{"k1": "a","k2": 1,"k3": 1.1,"k4": true,"k5": false,"k6": null,"k7": [1,1.1,false,"b"],"k8": {"c": 2,"d": 3}
}
以上列出了value所有可能的数据类型。当然,json文件中可以包含多个json对象,通常由一个大列表括起来,每个json对象间用逗号分隔:
[{"k1": 1,"k2": 2},{"k3": 3,"k4": 4}
]
事实上,json文件能存储的有:
- 单个简单值:例如数值,字符串,布尔值,null。
- 单个数组:数组的内容可以是简单值,其他数组以及json对象。
- 单个json对象:包含一系列key-value对。
对于数组和json对象,其中的最后一个元素后面不能有逗号。
json 库是python的标准库,它主要有四个函数:dump、dumps、load、loads,接下来也只讲解这四个函数。
2. dumps/loads
dumps用于将一个python对象转化成json格式的字符串,其中python对象必须是json可序列化的,即上面提到的三种。dumps这一过程又被称为序列化。
不严谨地来讲,dumps的函数签名如下:
def dumps(obj: Union[None, int, float, str, bool, list, dict], *args) -> str:pass
一些示例:
print(json.dumps(None))
# null
print(json.dumps(1))
# 1
print(json.dumps(3.3))
# 3.3
print(json.dumps("abc"))
# "abc"print(json.dumps([1, 2, 3, 4]))
# [1, 2, 3, 4]
print(json.dumps({"a": 1, "b": 2}))
# {"a": 1, "b": 2}
loads的作用与dumps相反,loads过程又被称为反序列化,即将一个json格式的字符串转化为相应的python对象。
不严谨地来讲,loads的函数签名如下:
def loads(s: str, *args) -> Union[None, int, float, str, bool, list, dict]:pass
📝
s还可以是bytes或bytearray,这超出了本文的讨论范围。
一些示例:
print(json.loads("null"))
# None
print(json.loads("1"))
# 1
print(json.loads("3.3"))
# 3.3
print(json.loads("\"abc\""))
# abcprint(json.loads("[1, 2, 3, 4]"))
# [1, 2, 3, 4]
print(json.loads("{\"a\": 1, \"b\": 2}"))
# {'a': 1, 'b': 2}
在使用dumps时有一个小细节,如下:
print(json.dumps("abc你好"))
# "abc\u4f60\u597d"
默认情况下,所有非 ASCII 字符(即那些无法用标准 ASCII 表示的字符)都被转义为 Unicode 转义序列。这样做的目的是为了确保生成的 JSON 字符串是 ASCII 编码的,因为一些旧系统或处理 JSON 数据的应用程序可能不支持非 ASCII 字符。
如果要防止对非ASCII字符进行转义,可以设置 ensure_ascii = False,如下:
print(json.dumps("abc你好", ensure_ascii=False))
# "abc你好"
3. dump/load
dump用于将一个python对象(需要是json可序列化的)保存到相应的json文件中,dump没有返回值。
with open('1.json', 'w') as f:json.dump([1, 2, 3], f)
load用于从一个json文件中读取并转化为相应的python对象:
with open('1.json') as f:print(json.load(f))
# [1, 2, 3]
4. jsonl格式
JSONL(JSON Lines)中的每一行都是一个json对象,如下:
{"name": "John", "age": 30, "city": "New York"}
{"name": "Alice", "age": 25, "city": "Los Angeles"}
{"name": "Bob", "age": 35, "city": "Chicago"}
JSONL 更适合处理大型数据集,特别是日志文件和行格式数据。它可以逐行处理,而不需要一次性加载整个文件到内存中。这使得它在处理大型数据文件时更具效率。
使用json库对jsonl文件进行读写:
# 读取
with open('1.jsonl') as r:for line in r:print(json.loads(line))# 写入
content = ... # 预定义
with open('1.jsonl', 'w') as w:for line in content:w.write(json.dumps(line, ensure_ascii=False) + '\n')
使用 jsonlines 库,我们可以更高效的处理jsonl文件:
import jsonlines# 读取
with jsonlines.open('1.jsonl') as r:for line in r:print(type(line), line)
# <class 'dict'> {'name': 'John', 'age': 30, 'city': 'New York'}
# <class 'dict'> {'name': 'Alice', 'age': 25, 'city': 'Los Angeles'}
# <class 'dict'> {'name': 'Bob', 'age': 35, 'city': 'Chicago'}# 写入
dic = {"a": 1, "b": 2}with jsonlines.open('1.jsonl', 'w') as w:w.write(dic) # 会自动加换行符# 写入多个
dic = [{"a": 1, "b": 2}, {"c": 3, "d": 4}]with jsonlines.open('1.jsonl', 'w') as w:w.write_all(dic)
可以看到我们能够直接对 dict 对象进行操作,而不需要进行 dict <-> str 的转化。
📝
write()有返回值,即当前行的字符总数(包括换行符)。write_all()是所有行的字符总数。
相关文章:
详解Python中的json库
目录 1. json简介2. dumps/loads3. dump/load4. jsonl格式 1. json简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于在不同应用程序之间传递数据。它是一种文本格式,易于阅读和编写,同时也易于…...
【Spring Boot】Spring Boot源码解读与原理剖析
这里写目录标题 前言精进Spring Boot首选读物“小册”变“大书”,彻底弄懂Spring Boot全方位配套资源,学不会来找我!技术新赛道,2023领先抢跑 前言 承载着作者的厚望,掘金爆火小册同名读物《Spring Boot源码解读与原理…...
C++学习(1)
一、C概述(了解) C在C语言的基础上添加了面向对象编程和泛型编程的支持 二、helloword程序(掌握) #define _CET_SECURE_NO_WARNINGS//在开发软件visual studio编译 c文件时, visual studio认为strcpy,scanf等函数不安全的导致报…...
机器人如何有效采摘苹果?
摘要:本文利用动捕数据构建拟人运动模型,对比观察两种苹果采摘模式,并对系统性能进行全面评估,为提高机器人采摘效率提供创新方法。 近期,一项关于苹果采摘机器人的有趣研究—— "Design and evaluation of a rob…...
C# OpenCvSharp Yolov8 Detect 目标检测
效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Open…...
rust数组
一、定义数组 (一)一维数组 1.指定所有元素 语法格式 let variable_name: [dataType; size] [value1,value2,value3];例如 let arr: [i32; 4] [10,20,30,40];2.指定初始值和长度 所有元素具有相同的值 语法格式 let variable_name: [dataType; siz…...
ubuntu | 安装NVIDIA套件:驱动、CUDA、cuDNN
CUDA 查看支持最高的cuda版本 nvidia-smiCUDA Version:12.2 区官网下在12.2.x最新的版本即可CUDA Toolkit Archive | NVIDIA Developer 下载安装 wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run sudo…...
JAVA学习笔记
一、学习要点 java的最大优势就是跨平台; java的三个版本,javaSE标准版本,javaEE企业版本,javaME微型版本(用的比较少); JVM(Java Virtual Machine,Java虚拟机); JRE…...
车载软件架构 —— 持续集成持续交付
车载软件架构 —— 持续集成持续交付 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 对学习而言,学习之后的思考、思考之后的行动、行动之后的改变更重要,如果不盯住内层的改变量,那么在表层投…...
c++ 二元运算符重载, 以加法为例
/* * c 二元运算符重载, 以加法为例 */ #include <stdio.h> class Complex { public: int r0; // real, 实部 int v0; //virtual, 虚部 }; // 重载加法 操作符 // 可见,c2元运算符,取其左侧为第一参数,右侧为第二参数 // 返回值可以付给新的变量 C…...
基于 SpringBoot+Vue的电影影城管理系统,附源码,数据库
文章目录 第一章 简介第二章 技术栈第三章 功能分析第四章 系统设计第5章 系统详细设计六 源码咨询 第一章 简介 本影城管理系统,是基于 Java SpringBoot 开发的。主要包括二大功能模块,即用户功能模块和管理员功能模块。 (1)管…...
Docker实战技巧(二):Kubernetes基础操作实战
Kubernetes定位在Saas层,重点解决了微服务大规模部署时的服务编排问题 1、关闭防火墙并设置开机禁用 systemctl stop firewalld systemctl disable firewalld 2、配置repo cd /etc/yum.repos.d/ 下载Docker repo wget https://mirrors.aliyun.com/docker-…...
计算机视觉与深度学习-循环神经网络与注意力机制-Attention(注意力机制)-【北邮鲁鹏】
目录 引出Attention定义Attention-based model通俗解释应用在图像领域图像字幕生成(image caption generation)视频处理 序列到序列学习:输入和输出都是长度不同的序列 引出Attention 传统的机器翻译是,将“机器学习”四个字都学…...
Centos7安装wps无法打开及字体缺失的问题解决
在centos7上安装了最新的wps2019版本的wps-office-11.1.0.11704-1.x86_64.rpm,生成了桌面图标并信任,可以新建文件,但是软件无法打开。在终端执行如下命令,用命令行启动wps: cd /opt/kingsoft/wps-office/office6/ ./…...
华为OD机试真题-会议接待-2023年OD统一考试(B卷)
题目描述: 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。 约束: 1、一个团只能上一辆车,并且代表团人数(代表团数量小于30,每个代表团人数小于30)小于…...
mysql explain学习记录
参考了公司内相关博客,实践并记录下,为后面分析并优化索引做准备。 MySQL explain命令是查看MySQL查询优化器如何执行查询的主要方法,可以很好的分析SQL语句的执行情况。 每当遇到执行慢(在业务角度)的SQL,…...
电压放大电路的作用有哪些(电压放大器)
电压放大电路是电子电路中常见且重要的组件,其主要作用是将输入信号的电压放大到所需的输出电压级别,并保持输入信号的形状和准确度。电压放大电路广泛应用于各种电子设备和系统中,具有以下几个重要的作用: 信号放大:电…...
编译opencv-3.4.5 [交叉编译]
在unbuntu20.04环境下编译opencv3.4.5, cmake 版本:3.27.4 gcc 版本:11.4.0 g版本:11.4.0 在此环境下编译opencv4.5.4正常。 1. 编译时遇到的问题 (1) Built target libprotobuf make: *** [Makefile:163…...
Canal 实现MySQL与Elasticsearch7数据同步
1 工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump协议 MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal ) canal 解析 binary log 对象(原始为 byte 流) 优点&…...
网络安全攻防对抗之隐藏通信隧道技术整理
完成内网信息收集工作后,渗透测试人员需要判断流量是否出得去、进得来。隐藏通信隧道技术常用于在访问受限的网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输。 一、隐藏通信隧道基础知识 (一)隐藏通信隧道概述 一般的网络通…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
