【Python】simplejson:Python 中的 JSON 编解码利器

news2024/11/30 14:41:50

在这里插入图片描述

simplejson 是一个高效且功能丰富的 Python JSON 编码和解码库。它能够快速地将 Python 数据结构转换为 JSON 格式(序列化),或将 JSON 格式的字符串转换为 Python 对象(反序列化)。相比标准库中的 json 模块,simplejson 提供了更多的选项和参数来优化 JSON 的处理,尤其在处理大规模数据或复杂对象时表现更优。

在这里插入图片描述
华丽的分割线

⭕️宇宙起点

    • 🔨 主要功能
    • 📦 安装与使用
      • 安装
      • 基础用法
      • 1. 编码(将 Python 数据结构转换为 JSON 字符串)
      • 2. 解码(将 JSON 字符串转换为 Python 对象)
    • 🥇 高级用法与自定义功能
      • 1. 使用自定义编码器处理复杂对象
      • 2. 自定义解码器映射 JSON 数据到特定对象
    • 🙉 流式处理与文件操作
      • 1. 将 JSON 数据写入文件
      • 2. 从文件中读取 JSON 数据
    • ❓ 常见问题与注意事项
    • 📥 下载地址
    • 💬 结语
    • 📒 参考文献


标题1

🔨 主要功能

  • 编码与解码:支持将 Python 数据(如字典、列表等)序列化为 JSON 字符串,也可从 JSON 格式解码为 Python 对象。
  • 浮点数精度控制:通过 use_decimal 参数支持高精度浮点数处理。
  • 自定义对象序列化与反序列化:支持自定义编码器与解码器,能够轻松处理复杂数据类型。
  • 多种格式化选项:提供了多种格式化和排序参数(如 indentseparators),可生成美观的 JSON 输出。
  • 支持 Python 2 和 3:simplejson 保持了对 Python 2.5 至 3.8 的兼容性,适用于不同版本的项目。

标题2

📦 安装与使用

安装

使用 pip 安装 simplejson 非常简单:

pip install simplejson

基础用法

1. 编码(将 Python 数据结构转换为 JSON 字符串)

使用 dumps() 函数可以将 Python 数据结构编码为 JSON 字符串:

import simplejson as json

data = {'name': 'Alice', 'age': 30, 'is_student': False}
json_str = json.dumps(data)
print(json_str)  # 输出:{"name": "Alice", "age": 30, "is_student": false}

常用参数:

  • indent:设置缩进字符,进行格式化输出。
  • separators:自定义键值对与元素间的分隔符。
  • sort_keys:按键值对的键进行排序。
  • ensure_ascii:控制是否强制将非 ASCII 字符转换为 Unicode 转义。

2. 解码(将 JSON 字符串转换为 Python 对象)

使用 loads() 函数可以将 JSON 字符串解码为 Python 数据结构:

json_str = '{"name": "Alice", "age": 30, "is_student": false}'
data = json.loads(json_str)
print(data)  # 输出:{'name': 'Alice', 'age': 30, 'is_student': False}

常用参数:

  • parse_float:指定自定义的浮点数解析函数(如 decimal.Decimal)。
  • object_hook:自定义解码规则,可实现复杂数据结构的映射。
  • use_decimal:使用高精度的 decimal.Decimal 进行浮点数解析。

标题3

🥇 高级用法与自定义功能

simplejson 提供了多种自定义序列化与反序列化选项,以下为一些高级用法:

1. 使用自定义编码器处理复杂对象

对于非标准 JSON 对象,可以自定义 default() 函数来控制其序列化行为:

import simplejson as json

class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, complex):
            return {'real': obj.real, 'imag': obj.imag}
        return super().default(obj)

data = {'number': 2 + 3j}
json_str = json.dumps(data, cls=ComplexEncoder)
print(json_str)  # 输出:{"number": {"real": 2.0, "imag": 3.0}}

2. 自定义解码器映射 JSON 数据到特定对象

可以使用 object_hook 来将 JSON 字符串解码为特定的 Python 对象:

import simplejson as json

def decode_complex(dct):
    if 'real' in dct and 'imag' in dct:
        return complex(dct['real'], dct['imag'])
    return dct

json_str = '{"number": {"real": 2.0, "imag": 3.0}}'
data = json.loads(json_str, object_hook=decode_complex)
print(data)  # 输出:{'number': (2+3j)}

标题4

🙉 流式处理与文件操作

1. 将 JSON 数据写入文件

使用 dump() 方法可以将 Python 对象以 JSON 格式写入文件:

import simplejson as json

data = {'name': 'Alice', 'age': 30, 'is_student': False}
with open('data.json', 'w') as f:
    json.dump(data, f, indent=4)

2. 从文件中读取 JSON 数据

使用 load() 方法可以从文件中读取 JSON 格式数据并解码为 Python 对象:

import simplejson as json

with open('data.json', 'r') as f:
    data = json.load(f)
print(data)  # 输出:{'name': 'Alice', 'age': 30, 'is_student': False}

标题5

❓ 常见问题与注意事项

  1. 如何处理 NaN、Infinity 等特殊浮点数?
    simplejson 默认不支持这些特殊值,可以通过 allow_nan=True 来启用。

  2. 如何使用 Decimal 处理高精度浮点数?
    使用 use_decimal=True 来启用 decimal.Decimal 解析,以避免浮点数精度丢失。

  3. 如何优化 JSON 序列化的性能?
    使用 separators=(',', ':') 消除不必要的空格和换行符,以生成最紧凑的 JSON 格式。


标题6

📥 下载地址


simplejson 最新版 下载地址


标题7

💬 结语

simplejson 是一个功能强大的 JSON 处理库,它扩展了 Python 标准库中的 json 模块,提供了更多的选项和参数,使得复杂数据结构的序列化与反序列化更为简单。同时,它还支持高精度浮点数处理、自定义编码器和解码器、文件流式操作等多种高级功能,能够满足大多数数据处理需求。


标题8

📒 参考文献

  • simplejson 官网
  • simplejson GitHub仓库

TheEnd


在这里插入图片描述
在这里插入图片描述

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

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

相关文章

数据结构实验二 顺序表的应用

数据结构实验二 顺序表的应用 一、实验目的 1、掌握建立顺序表的基本方法。 2、掌握顺序表的插入、删除算法的思想和实现,并能灵活运用 二、实验内容 用顺序表实现病历信息的管理与查询功能。具体要求如下: 1.利用教材中定义顺序表类型存储病人病历信息(病历号…

直立行走机器人技术概述

直立行走机器人技术作为现代机器人领域的重要分支,结合了机械工程、计算机科学、人工智能、传感技术和动态控制等领域的最新研究成果。随着技术的不断发展,直立行走机器人在救灾、医疗、家庭辅助等领域开始发挥重要作用。本文旨在对直立行走机器人的相关…

Java 注释新手教程一口气讲完!ヾ(≧▽≦*)o

Java 注释 Java面向对象设计 - Java注释 什么是注释? Java中的注释允许我们将元数据与程序元素相关联。 程序元素可以是包,类,接口,类的字段,局部变量,方法,方法的参数,枚举&…

【STM32开发之寄存器版】(五)-窗口看门狗WWDG

一、前言 窗口看门狗简介: 窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个M…

C语言 | Leetcode C语言题解之第459题重复的子字符串

题目&#xff1a; 题解&#xff1a; bool kmp(char* query, char* pattern) {int n strlen(query);int m strlen(pattern);int fail[m];memset(fail, -1, sizeof(fail));for (int i 1; i < m; i) {int j fail[i - 1];while (j ! -1 && pattern[j 1] ! pattern…

Pikachu-PHP反序列化

从后端代码可以看出&#xff0c;拿到序列化后的字符串&#xff0c;直接做反序列化&#xff1b;并且在前端做了展示&#xff1b; 如果虚拟化后的字符串&#xff0c;包含alert 内容&#xff0c;反序列化后&#xff0c;就会弹出窗口 O:1:"S":1:{s:4:"test";s…

佑航科技Pre-A+轮融资成功:加速车载超声波芯片研发与量产

近日,超声波芯片领域的领先企业珠海佑航科技有限公司(简称“佑航科技”)宣布成功完成数千万元的Pre-A+轮战略融资。本轮融资由上市公司思瑞浦微电子旗下的芯阳基金进行战略投资,标志着佑航科技在车载超声波芯片及传感器领域的研发与量产能力迈上了新台阶。此次融资不仅为佑…

《Linux从小白到高手》理论篇:深入理解Linux的网络管理

今天继续宅家&#xff0c;闲来无事接着写。本篇详细深入介绍Linux的网络管理。 如你所知&#xff0c;在Linux中一切皆文件。网卡在 Linux 操作系统中用 ethX,是由 0 开始的正整数&#xff0c;比如 eth0、eth1… ethX。而普通猫和ADSL 的接口是 pppX&#xff0c;比如 ppp0 等。 …

Golang | Leetcode Golang题解之第459题重复的子字符串

题目&#xff1a; 题解&#xff1a; func repeatedSubstringPattern(s string) bool {return kmp(s s, s) }func kmp(query, pattern string) bool {n, m : len(query), len(pattern)fail : make([]int, m)for i : 0; i < m; i {fail[i] -1}for i : 1; i < m; i {j : …

【Python游戏开发】贪吃蛇游戏demo

准备步骤 项目开发使用【Mu 编辑器】 1.新建项目&#xff0c;并导入游戏图片 游戏编写 1.创建场景 SIZE 15 # 每个格子的大小 WIDTH SIZE * 30 # 游戏场景总宽度 HEIGHT SIZE * 30 # 游戏场景总高度def draw():screen…

Spring源码-依赖注入

核心方法是&#xff1a;populateBean 整体流程&#xff1a;首先进行Spring自带的依赖注入&#xff0c;包括byName和byType&#xff0c;然后进行注解Autowired的注入 1.Spring自带依赖注入byName和byType 核心代码&#xff1a; int resolvedAutowireMode mbd.getResolvedAu…

C++ | Leetcode C++题解之第459题重复的子字符串

题目&#xff1a; 题解&#xff1a; class Solution { public:bool kmp(const string& query, const string& pattern) {int n query.size();int m pattern.size();vector<int> fail(m, -1);for (int i 1; i < m; i) {int j fail[i - 1];while (j ! -1 &…

【星汇极客】手把手教学STM32 HAL库+FreeRTOS之任务管理(2)

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括但不限于&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三。 后面会经常写一下博客&…

Spring Boot与iTextPdf:高效生成PDF文件预览

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在现代应用程序开发中&#xff0c;生成PDF文件是一个常见的需求。PDF文件因其跨平台性和易读性&#xff0c;被广泛应用于文档交换、报告生成和打印预览等场景。Spring Boot作为一个用于简化Spring应用开发的框…

华为OD机试 - 几何平均值最大子数(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

uniapp固定document.title标题

由于业务中需要将h5的标题固定 但是uniapp没有对应的接口 所以使用Object.defineProperty拦截set方法来实现 代码也很简单 在App.vue的onLaunch加上就行了 onLaunch: function() {document.title 固定标题;Object.defineProperty(document, title, {set() {return false;}});…

USB 3.0?USB 3.1?USB 3.2?怎么区分?

还记得小白刚接触电脑的时候&#xff0c;电脑普及的USB接口大部分是USB 2.0&#xff0c;还有少部分USB 1.0的&#xff08;现在基本上找不到了&#xff09;。 当时的电脑显示器&#xff0c;可能00后的小伙伴都没见过&#xff0c;它们大概长这样&#xff1a; 当时小白以为电脑最…

C++ 算法学习——1.6 差分算法与二维差分算法

一维差分算法概述&#xff1a; 差分算法是一种用于计算序列中相邻元素之间差值的技术。在C中&#xff0c;STL&#xff08;标准模板库&#xff09;提供了std::adjacent_difference函数来实现差分算法。 std::adjacent_difference函数&#xff1a; std::adjacent_difference函数位…

基于MindSpore实现CycleGAN壁画修复

基于MindSpore实现CycleGAN壁画修复_哔哩哔哩_bilibili 本案例运行需要较大内存&#xff0c;建议在Ascend/GPU上运行。 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation us…

指针赋值or常数赋值

int main (){int a 10;int b ;b a;int *c &a;int *d c; } 常数 a,b赋值&#xff1a; 都是将存储的值&#xff08;10&#xff09;赋值给别人。 指针赋值也是类似的&#xff1a; 指针存储的值&#xff08;&a&#xff09;为地址&#xff0c;就是把c指向的地址赋值给…