百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Python 数据的 JSON 格式序列化及反序列化

wptr33 2025-03-29 23:05 13 浏览

在 Python 中,将数据转换为 JSON 格式非常简单,可以使用内置的 json 模块。json 模块提供了 json.dumps()json.dump() 方法,用于将 Python 对象(如字典、列表、字符串等)转换为 JSON 字符串或写入文件。

一、Python 数据的 JSON 格式序列化

1. 使用 json.dumps() 将 Python 对象转换为 JSON 字符串

json.dumps() 方法将 Python 对象转换为 JSON 格式的字符串。

示例代码:


import json


# Python 字典

data = {

"name": "John",

"age": 30,

"is_student": False,

"courses": ["Math", "Science"],

"address": {

"city": "New York",

"zipcode": "10001"

}

}


# 将 Python 对象转换为 JSON 字符串

json_string = json.dumps(data, indent=4) # indent 参数用于美化输出,缩进 4 个空格

print(json_string)


输出:


{

"name": "John",

"age": 30,

"is_student": false,

"courses": [

"Math",

"Science"

],

"address": {

"city": "New York",

"zipcode": "10001"

}

}


2. 使用 json.dump() 将 Python 对象写入 JSON 文件

json.dump() 方法将 Python 对象直接写入文件。

示例代码:


import json


# Python 字典

data = {

"name": "John",

"age": 30,

"is_student": False,

"courses": ["Math", "Science"],

"address": {

"city": "New York",

"zipcode": "10001"

}

}


# 将 Python 对象写入 JSON 文件

with open("data.json", "w") as json_file:

json.dump(data, json_file, indent=4) # indent 参数用于美化输出


文件内容data.json


{

"name": "John",

"age": 30,

"is_student": false,

"courses": [

"Math",

"Science"

],

"address": {

"city": "New York",

"zipcode": "10001"

}

}


3. 处理不支持的数据类型

默认情况下,json 模块只能序列化以下 Python 数据类型:

  • 字典
  • 列表
  • 字符串
  • 整数
  • 浮点数
  • 布尔值
  • None

如果需要序列化其他数据类型(如日期、自定义对象等),可以通过 default 参数指定一个转换函数。

示例代码:


import json

from datetime import datetime


# 自定义对象

class User:

def __init__(self, name, age):

self.name = name

self.age = age


# 自定义转换函数

def custom_serializer(obj):

if isinstance(obj, datetime):

return obj.isoformat() # 将 datetime 转换为字符串

elif isinstance(obj, User):

return {"name": obj.name, "age": obj.age} # 将 User 对象转换为字典

raise TypeError(f"Type {type(obj)} not serializable")


# 数据包含自定义对象和日期

data = {

"user": User("John", 30),

"created_at": datetime.now()

}


# 使用 default 参数处理不支持的类型

json_string = json.dumps(data, default=custom_serializer, indent=4)

print(json_string)


输出:


{

"user": {

"name": "John",

"age": 30

},

"created_at": "2023-10-05T12:34:56.789012"

}


4. 其他常用参数

  • indent:指定缩进空格数,用于美化输出。
  • sort_keys:是否按键名排序(默认为 False)。
  • ensure_ascii:是否确保输出为 ASCII 字符(默认为 True,设置为 False 可以输出非 ASCII 字符)。

示例:


json_string = json.dumps(data, indent=4, sort_keys=True, ensure_ascii=False)



总结

  • 使用 json.dumps() 将 Python 对象转换为 JSON 字符串。
  • 使用 json.dump() 将 Python 对象写入 JSON 文件。
  • 通过 default 参数处理不支持的数据类型。
  • 使用 indentsort_keys 等参数控制输出格式。

JSON 是 Web 开发中常用的数据交换格式,Python 的 json 模块提供了简单易用的工具来处理 JSON 数据。

二、Python 的 JSON 字符串反序列化

在 Python 中,将 JSON 字符串反序列化为 Python 对象(如字典、列表等)也非常简单,可以使用内置的 json 模块。json 模块提供了 json.loads() json.load() 方法,用于将 JSON 字符串或文件内容转换为 Python 对象。

1. 使用 json.loads() 将 JSON 字符串转换为 Python 对象

json.loads() 方法将 JSON 格式的字符串转换为 Python 对象(通常是字典或列表)。

示例代码:


import json


# JSON 字符串

json_string = '''

{

"name": "John",

"age": 30,

"is_student": false,

"courses": ["Math", "Science"],

"address": {

"city": "New York",

"zipcode": "10001"

}

}

'''


# 将 JSON 字符串转换为 Python 对象

data = json.loads(json_string)

print(data)

print(type(data)) # 输出


输出:


{

'name': 'John',

'age': 30,

'is_student': False,

'courses': ['Math', 'Science'],

'address': {

'city': 'New York',

'zipcode': '10001'

}

}


2. 使用 json.load() 从 JSON 文件读取并转换为 Python 对象

json.load() 方法从文件中读取 JSON 数据并转换为 Python 对象。

示例代码:

假设有一个 data.json 文件,内容如下:


{

"name": "John",

"age": 30,

"is_student": false,

"courses": ["Math", "Science"],

"address": {

"city": "New York",

"zipcode": "10001"

}

}


读取并解析文件:


import json


# 从 JSON 文件中读取并转换为 Python 对象

with open("data.json", "r") as json_file:

data = json.load(json_file)


print(data)

print(type(data)) # 输出


输出:


{

'name': 'John',

'age': 30,

'is_student': False,

'courses': ['Math', 'Science'],

'address': {

'city': 'New York',

'zipcode': '10001'

}

}


3. 处理复杂数据类型

默认情况下,json 模块会将 JSON 数据转换为以下 Python 数据类型:

  • JSON 对象 → Python 字典
  • JSON 数组 → Python 列表
  • JSON 字符串 → Python 字符串
  • JSON 数字 → Python 整数或浮点数
  • JSON true/false → Python True/False
  • JSON null → Python None

如果需要将 JSON 数据转换为自定义对象,可以使用 object_hook 参数。

示例代码:


import json


# JSON 字符串

json_string = '''

{

"name": "John",

"age": 30,

"is_student": false,

"address": {

"city": "New York",

"zipcode": "10001"

}

}

'''


# 自定义类

class User:

def __init__(self, name, age, is_student, address):

self.name = name

self.age = age

self.is_student = is_student

self.address = address


def __repr__(self):

return f"User(name={self.name}, age={self.age}, is_student={self.is_student}, address={self.address})"


# 自定义转换函数

def custom_deserializer(dct):

if "name" in dct and "age" in dct: # 判断是否为 User 对象

return User(dct["name"], dct["age"], dct["is_student"], dct["address"])

return dct


# 使用 object_hook 参数处理自定义对象

data = json.loads(json_string, object_hook=custom_deserializer)

print(data)


输出:


User(name=John, age=30, is_student=False, address={'city': 'New York', 'zipcode': '10001'})


4. 其他注意事项

  • JSON 字符串格式必须正确:如果 JSON 字符串格式不正确(例如缺少引号、括号不匹配等),会抛出 json.JSONDecodeError 异常。
  • 处理日期和时间:JSON 本身不支持日期和时间类型,通常需要将日期时间转换为字符串后再反序列化。

示例:处理日期时间


import json

from datetime import datetime


# JSON 字符串

json_string = '''

{

"event": "Conference",

"date": "2023-10-05T12:34:56"

}

'''


# 自定义转换函数

def custom_deserializer(dct):

if "date" in dct:

dct["date"] = datetime.fromisoformat(dct["date"]) # 将字符串转换为 datetime 对象

return dct


# 使用 object_hook 参数处理日期时间

data = json.loads(json_string, object_hook=custom_deserializer)

print(data)


输出:


{

'event': 'Conference',

'date': datetime.datetime(2023, 10, 5, 12, 34, 56)

}


总结

  • 使用 json.loads() 将 JSON 字符串转换为 Python 对象。
  • 使用 json.load() 从 JSON 文件读取并转换为 Python 对象。
  • 使用 object_hook 参数处理自定义对象或复杂数据类型。
  • JSON 是 Web 开发中常用的数据交换格式,Python 的 json 模块提供了简单易用的工具来处理 JSON 数据。

好了,此文足已能让你无忧于 Python 数据的 JSON 格式序列化及反序列化了。

爱学习小伙伴关注不迷路哟~

python

相关推荐

MYSQL术语介绍:dynamic row format

InnoDB行格式。因为可变长度列值存储在保存行数据的页面之外,所以对于包含大对象的行非常有效。由于通常不会访问大字段来评估查询条件,因此不会经常将它们带入缓冲池,从而减少I/O操作并更好地利用缓...

阿里面试:MySQL Binlog有哪些格式?底层原理?优缺点?

binlog的格式也有三种:STATEMENT、ROW、MIXED,下面我详解binlog三种模式@mikechenStatement模式Statement模式:是基于SQL语句的复制(statem...

Mysql日期格式化显示“年月”(mysql日期格式化)

数据库中存储格式为DATE,如果只显示年月,就需要将日期数据格式化。下面通过两种方式对其格式化显示:...

看完这篇还不懂 MySQL 主从复制,可以回家躺平了

我们在平时工作中,使用最多的数据库就是MySQL...

MySQL binlog format (Statement、Row、Mixed) 二进制日志格式

MySQL的binlog日志作用是用来记录MySQL内部增删改查等对MySQL数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被binlog日志记录,主要用于数据...

性能优化-界面卡顿和丢帧(Choreographer 代码检测)

标签:ChoreographerUI卡顿UI丢帧本文将介绍3个知识点:获取系统UI刷新频率检测UI丢帧和卡顿输出UI丢帧和卡顿堆栈信息...

使用Java分析器优化代码性能,解决OOM问题

背景最近我一直在做性能优化,对一个单机应用做性能优化。主要是涉及到解析和导入导出相关的业务。大致说一下这个单机应用干嘛的:制作票样,类似于答题卡。发给某些人填写,然后通过单机python图像识别存到数...

面试必问的HashCode技术内幕(hashmap面试题原理)

3hashCode的内幕tips:面试常问/常用/常出错...

实战Netty!基于私有协议,怎样快速开发网络通信服务

私有协议编写目的本文档用于描述边缘计算单元(以下简称边缘盒)与上位机配置软件(以下简称上位机)之间进行的数据交互通信协议。通信方式...

C#工控上位机系列(2)- 串口通信/监控工具

工控机通常都带有很多串口(10个),而且可以通过Moxa卡扩展串口.但Moxa的串口和电脑自带的串口还是有点区别C#里面没区别,但之前VB6的MSComm控件有时就会有不一样的地方.支持串口通讯...

Java加密与解密之消息摘要算法1(消息摘要(hash函数编码法),又称数字指纹 ( ))

消息摘要算法有3大类,分别是:MD、SHA、MAC,通常用于数据完整性的验证。MD:MessageDigest消息摘要算法。包括:MD2,MD4,MD53种算法。SHA:SecureHashA...

zookeeper的Leader选举源码解析(zookeeper角色选举角色包括)

作者:京东物流梁吉超zookeeper是一个分布式服务框架,主要解决分布式应用中常见的多种数据问题,例如集群管理,状态同步等。为解决这些问题zookeeper需要Leader选举进行保障数据的强一致...

Java 中五种最常见加密算法:原理、应用与代码实现

引言在现代软件开发中,数据安全至关重要。无论是用户密码存储、敏感信息传输,还是系统间的通信,加密技术都扮演着核心角色。Java作为广泛使用的编程语言,通过javax.crypto和java.s...

干货|6招学会调用NFC的各个功能(调出nfc)

现在越来越多的手机支持NFC功能,这种轻松、安全、迅速的通信的无线连接技术,能够让我们的手机替代门禁卡、公交卡、银行卡甚至是车钥匙,那么怎么让APP中能够调用这个功能呢?今天小编就来教给大家!...

一文读懂流媒体协议之RTP 协议(rtp流媒体服务器)

一、简介1.1RTPRTP全名是Real-timeTransportProtocol(实时传输协议)。它是IETF提出的一个标准,对应的RFC文档为RFC3550(RFC1889为其过期版本)。...