深入理解Python中的JSON处理

目录

一、引言

二、JSON简介

2.1 基本规则:

2.2 写法示例:

对象:

数组

数值

字符串

布尔值和null:

三、Python中的JSON

3.1 序列化和反序列:

3.2 Python json模块概览

3.3 读取JSON数据

3.4 写入JSON数据

3.5 JSON进阶处理

3.5.1 美化输出(pretty-printing)

3.5.2 处理复杂数据类型(日期、自定义对象等)

3.5.3 解决编码问题

3.6 JSON与异常处理

四、总结


一、引言

介绍JSON的重要性以及它在现代编程和网络通信中的普遍应用,特别是在API和Web服务中。

二、JSON简介

JSON格式是一种用于结构化数据的轻量级文本交换格式。它采用完全独立于语言的文本格式,但使用了类似于JavaScript对象字面量的习惯性表示法。下面是JSON格式和写法的一些基本规则和示例:

2.1 基本规则:

  1. 数据在名称/值对中: 数据由键值对构成。键用双引号"包裹,后面跟一个冒号:,然后是值。
  2. 数据由逗号分隔: 多个键值对由逗号,分隔。
  3. 花括号保存对象: 由花括号{}包围的是对象,表示一组无序的键值对。
  4. 方括号保存数组: 由方括号[]包围的是数组,表示值的有序集合。
  5. 字符串必须用双引号表示: JSON中的字符串必须由双引号"包围。
  6. 数字不用引号: 数值不必使用引号包围。
  7. 文件以UTF-8编码: JSON文本应该以UTF-8编码保存。

2.2 写法示例:

对象:

JSON对象是由花括号包围的键值对的集合。键(Key)必须是字符串,用双引号括起来,而值(Value)可以是字符串、数值、数组、布尔值、null,甚至另一个对象。键和值之间用冒号隔开,不同的键值对之间用逗号隔开。

{"name": "John Doe","age": 30,"isStudent": false,"address": {"street": "123 Main St","city": "Anytown"}
}
数组

JSON数组是由方括号包围的有序值的集合。数组中的值可以是字符串、数值、对象、数组、布尔值或null。数组中的元素用逗号分隔。

["apple","banana","cherry"
]
数值

JSON数值可以是整数或浮点数,和大多数编程语言中的数值表示相似。

{"integer": 25,"float": 3.14159
}
字符串

JSON字符串是由双引号包围的字符序列。字符串是文本数据的表示方式,可以包含任何Unicode字符。

{"greeting": "Hello, World!"
}
布尔值和null:

JSON布尔值只有两个,truefalse。它们用于表示逻辑值。

null 在JSON中用于表示一个空值或不存在的值。

{"isStudent": false,"nickname": null
}

三、Python中的JSON

3.1 序列化和反序列:

在编程中,序列化和反序列化是两个互补的过程,用于将对象状态或数据结构转换为可存储或传输的格式(如JSON或XML),以及将这种格式重新转换回原来的对象状态或数据结构。

  • 序列化(Serialization)是将对象转换为字节流的过程,以便可以在网络上传输或保存到磁盘或数据库中。在序列化过程中,对象的状态和数据将被转换为二进制格式,使其能够被传输或存储。

举例: 当你把JSON数据写入一个TXT文件时,你实际上是在做序列化操作。你把在内存中的数据结构(例如,Python的字典、列表等)转换为JSON格式的字符串,并保存这个字符串到一个文本文件中。这个过程涉及到“序列化”,因为你把内存中的数据结构转换为了一种能够被存储和传输的格式。

  • 反序列化(Deserialization)则是将序列化的字节流重新转换回对象的过程。通过反序列化,我们可以从字节流中重新构建出原始对象,并且恢复其状态和数据。

举例:如果在之后的某个时刻,你需要读取这个TXT文件并使用文件中的数据,你将需要把这个JSON格式的字符串“反序列化”成原来的数据结构,以便在代码中使用这些数据。这个过程通常涉及到解析这个字符串,并根据其内容重建原来的数据结构或对象。

3.2 Python json模块概览

在Python中,json 模块提供了一种简单的方法来编码和解码JSON数据。也就是说,它允许你将Python对象转换为JSON格式的字符串,也可以将JSON格式的字符串转换为Python对象。

基本功能:

以下是json模块的一些基本功能:

  1. json.dumps(obj): 将Python对象编码成JSON字符串,这个过程称为序列化。你可以通过这个方法,将字典、列表、元组和原生数据类型转换为JSON格式的字符串。

  2. json.loads(s): 将已编码的JSON字符串解码为Python对象,这个过程称为反序列化。该方法用于处理存储在字符串中的JSON数据。

  3. json.dump(obj, fp): 将Python对象编码成JSON格式,并将其写入到一个类文件对象fp中。这对于写入JSON文件非常有用。

  4. json.load(fp): 读取类文件对象fp中的JSON数据,并将其解码为Python对象。这在读取JSON文件时非常常用。

3.3 读取JSON数据

  • 如何使用json.loads()从字符串中读取JSON数据
import jsonjson_data = '{"name": "John", "age": 30, "city": "New York"}'
python_obj = json.loads(json_data)
print(python_obj["name"])  # 输出: John
  • 使用json.load()从文件中读取JSON数据
import jsonwith open('data.json', 'r', encoding='utf-8') as file:python_obj = json.load(file)print(python_obj["age"])  # 输出: 30

3.4 写入JSON数据

  • 使用json.dumps()将Python对象转换为JSON字符串
import jsonpython_dict = {"name": "Jane", "age": 25, "city": "Paris"}
json_data = json.dumps(python_dict)
print(json_data)  # 输出: {"name": "Jane", "age": 25, "city": "Paris"}

  • 使用json.dump()将Python对象写入文件
import jsonpython_dict = {"name": "Jane", "age": 25, "city": "Paris"}
with open('data.json', 'w', encoding='utf-8') as file:json.dump(python_dict, file)

3.5 JSON进阶处理

3.5.1 美化输出(pretty-printing)

要美化JSON输出,你可以使用json.dumps()方法的indent参数。此外,sort_keys参数可以让JSON数据中的键按字母顺序输出。

import jsondata = {"name": "John Doe","age": 30,"isStudent": False,"courses": ["Math", "Science"]
}pretty_json = json.dumps(data, indent=4, sort_keys=True)
print(pretty_json)
3.5.2 处理复杂数据类型(日期、自定义对象等)

JSON标准本身不支持特定的复杂数据类型(如日期或自定义对象)。要处理这些类型,你需要在序列化和反序列化过程中进行自定义转换。

日期

对于日期类型,你可以在序列化时将其转换为字符串,在反序列化时再从字符串转换回日期类型。

import json
from datetime import datetime, datedef date_handler(obj):if hasattr(obj, 'isoformat'):return obj.isoformat()else:raise TypeError("Type is not serializable")data = {"name": "John Doe","birthday": date(1990, 4, 28)
}json_data = json.dumps(data, default=date_handler)
print(json_data)

自定义对象

对于自定义对象,可以定义一个函数,将对象转换为可JSON序列化的形式。同样,也可以在反序列化时进行相应的转换。

class User:def __init__(self, name, age):self.name = nameself.age = age# 自定义序列化函数
def encode_user(obj):if isinstance(obj, User):return {'name': obj.name, 'age': obj.age}  # 或其他可识别的格式raise TypeError("Object of type User is not JSON serializable")user = User("Jane Doe", 32)
user_json = json.dumps(user, default=encode_user)
print(user_json)
3.5.3 解决编码问题

在处理非ASCII字符时,设置ensure_ascii参数为False可以避免将这些字符转换成ASCII字符编码的序列,从而可以直接在JSON字符串中使用原始字符。

data = {"name": "张三","age": 30,"isStudent": False
}json_data = json.dumps(data, ensure_ascii=False)
print(json_data)

3.6 JSON与异常处理

  • 处理JSON解析错误
import jsonjson_data = '{"name": "John", age: 30, "city": "New York"}'  # 错误的JSON格式
try:python_obj = json.loads(json_data)
except json.JSONDecodeError as e:print(f"解析JSON时发生错误:{e}")

四、总结

强调掌握Python中的JSON处理对于进行有效的数据交换和应用程序开发的重要性。

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

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

相关文章

MYSQL 5.7重置root密码

Mysql 5.7重置root密码 如果您忘记了MySQL 5.7的root密码,可以通过以下步骤重置: 停止MySQL服务。在命令行中输入以下命令: systemctl stop mysqld启动MySQL服务并跳过授权表。在命令行中输入以下命令: mysqld_safe --skip-gra…

前端小白的学习之路(Vue2 一)

提示:初学vue,vue2好上手一点,记录笔记:vue的概念,声明式编程与命令式编程的区别,vue的基本使用,模板语法,常用指令 目录 一、什么是vue 二、声明式编程与命令式编程 1.命令式编程 2.声明式编程 三、v…

聚类分析 | 聚类有效性评价指标外部NMI(MATLAB)

指标解释 聚类有效性评价指标中的外部NMI(Normalized Mutual Information,归一化互信息)是一种常见的外部有效性指标,用于评估聚类结果与真实标签之间的相似度。NMI从信息论的角度出发,衡量两个聚类结果的共享信息量。 NMI的计算基于聚类结果和真实标签之间的互信息以及…

Vue.nextTick() 使用场景及实现原理

Vue.nextTick() 基本使用 作用: 等待下一次 DOM 更新刷新的工具方法。 为什么需要用到Vue.nextTick()? 当你在 Vue 中更改响应式状态时,最终的 DOM 更新并不是同步生效的,而是由 Vue 将它们缓存在一个队列中,直到下一…

tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图

文章目录 前言一、实现步骤1. 获取所需特征点的索引2. 使用opencv.js 计算俯仰角、水平角和翻滚角cv.solvePnP介绍cv.solvePnP原理运行代码查看效果 3.绘制姿态示意直线添加canvas元素计算姿态直线坐标并绘制 总结 前言 在计算机视觉领域,估算脸部姿态是一项具有挑…

注入类型(二)

一、二次注入 原理 在第一次进行数据库插入数据的时候,使用了addslashes等函数对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加 "\" 进行转义,但是 "\" 并不会插入到数据库中&#xff…

Dubbo 负载均衡

Dubbo 负载均衡 1、什么是负载均衡? 负载均衡是在支持应用程序的资源池中平均分配网络流量的一种方法。 现代应用程序必须同时处理数百万用户,并以快速、可靠的方式将正确的文本、视频、图像和其他数据返回给每个用户。 为了处理如此高的流量&#x…

(虚拟DOM)前端八股文修炼Day10

一 虚拟 DOM 是什么 虚拟 DOM (Virtual DOM) 本质上是真实 DOM 的一个轻量级的 JavaScript 表示形式。它是一个在内存中的抽象,用于描述真实 DOM 的结构和内容。虚拟 DOM 提供了一种机制,允许开发者通过操作 JavaScript 对象来间接更新页面,…

GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程)

🐯 GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程) 📁 文章目录 🐯 GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图…

【Leetcode】【240406】1249. Minimum Remove to Make Valid Parentheses

其实大部分是东京时间第二天凌晨才做的- -但国际服刷新比较晚 BGM:刀剑如梦 Decsripition Given a string s of ‘(’ , ‘)’ and lowercase English characters. Your task is to remove the minimum number of parentheses ( ‘(’ or ‘)’, in any position…

0104练习与思考题-算法基础-算法导论第三版

2.3-1 归并示意图 问题:使用图2-4作为模型,说明归并排序再数组 A ( 3 , 41 , 52 , 26 , 38 , 57 , 9 , 49 ) A(3,41,52,26,38,57,9,49) A(3,41,52,26,38,57,9,49)上的操作。图示: tips::有不少在线算法可视化工具(软…

鸿蒙内核源码分析 (内存管理篇) | 虚拟内存全景图是怎样的

初始化整个内存 OsSysMemInitOsMainmain从 main() 跟踪可看内存部分初始化是在 OsSysMemInit() 中完成的。 UINT32 OsSysMemInit(VOID) {STATUS_T ret;OsKSpaceInit();//内核空间初始化ret OsKHeapInit(OS_KHEAP_BLOCK_SIZE);// 内核动态内存初始化 512K if (ret ! LOS_OK…

【LeetCode】454. 四数相加 II

目录 题目 思路 代码 题目 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1…

一款轻量、干净的 Laravel 后台管理框架

系统简介 ModStart 是一个基于 Laravel 的模块化快速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 系统特性 …

做过的题-最大字段和的一个模板题

题目链接&#xff1a;StarryCoding | 奕歌科技 #include <bits/stdc.h> using ll long long; using namespace std; const int N 1e5 9; int a[N]; //对应动物的类型 int w[N]; //对应动物的体重 ll s[N]; //偏移量前缀和(释放魔法后) int main() {ios::sync_with_s…

蓝桥杯每日一题(博弈论)

4005 取石子游戏 巴什博弈: 取石子儿&#xff0c;石子儿一共n个&#xff0c;如果只能取1-m个&#xff0c;两个人轮流取。 (m1)|n 先手取x个&#xff0c;后手就可以取&#xff08;m1-x&#xff09;个。最后一定是后手全部取完。 若不能整除n的话。若先手先把余数全部取完…

【R语言基础】如何提取矩阵的上三角矩阵

如何提取矩阵的上三角矩阵&#xff1a; 例如&#xff1a;已知矩阵&#xff0c;如何求除对角线值以外均值。 问题描述 提示&#xff1a;求矩阵最大值、最小值、均值&#xff1b;可以值提取上/下三角形矩阵&#xff1b;借助R包 实现方法 借助R包gdata,函数upper.tri 与函数 l…

第三、四章 if语句 + 循环

第三章 if语句 bool类型 两种&#xff1a;True和False bool_1 True bool_2 False print(f"bool_1变量的内容是&#xff1a;{bool_1}," f"类型是&#xff1a;{type(bool_1)}") print(f"bool_2变量的内容是&#xff1a;{bool_2}," f"类…

解决Selenium元素拖拽不生效Bug

前几天在使用Selenium进行元素拖拽操作时&#xff0c;发现Selenium自带的元素拖拽方法&#xff08;dragAndDrop()&#xff09;不生效&#xff0c;网上的回答也是五花八门&#xff0c;比较混乱&#xff0c;尝试了以下几种方法均无法解决。 方案1&#xff1a;通过dragAndDrop()方…

外部模块介绍(七) 蓝牙HC05

HC05原理图 2. 蓝牙模块的调试 2.1 两种工作模式: HC-05蓝牙串口通讯模块具有两种工作模式:命令响应工作模式和自动连接工作模式。在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。 当模块处于自动连接工作模式时,将自动根据事…