Python JSON处理:兼容性与高级应用

JSON(JavaScript Object Notation)作为当前最流行的数据传输格式,在Python中也有多种实现方式。由于JSON的跨平台性和简便易用性,它在数据交互中被广泛应用。本文将重点讨论如何熟练应用Python的JSON库,将JSON数据映射到文本以及从文本映射到对象中。
在这里插入图片描述

官方json库

Python提供了多个JSON库,其中官方的json库是使用最广泛的。相比于其他库,我个人更偏向使用json库,因为它相对简单,而且避免了pickle存在的一些反序列化漏洞。下面是一些官方json库的简单用法示例:

import jsonprint(json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]))
# '["foo", {"bar": ["baz", null, 1.0, 2]}]'
print(json.dumps("\"foo\bar"))
# "\"foo\bar"
print(json.dumps('\u1234'))
# "\u1234"
print(json.dumps('\\'))
# "\\"
print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
# {"a": 0, "b": 0, "c": 0}

上述代码展示了一些json库的基本用法,但我们将重点关注在实际工作中如何使用它来进行对象的序列化和反序列化。
在这里插入图片描述

进阶用法

当前端向后端传递JSON文本时,我们可以使用json.loads()方法将其正确映射到Python对象中,这个过程被称为反序列化。使用对象处理数据更规范,尽管对于一些快速开发来说,直接使用字典可能更方便。下面是一个演示如何将JSON文本映射到对象中的例子:

import json
from io import StringIOclass ResponseData:def __init__(self, id, feed_id):self.id = idself.feed_id = feed_idclass Response:def __init__(self, status=None, info=None, data=None):self.status = statusself.info = infoself.data = datadef to_json(self):return {"status": self.status,"info": self.info,"data": self.data.__dict__ if self.data else None}@staticmethoddef object_hook(d):if "status" in d:return Response(d['status'], d['info'], d['data'])else:return ResponseData(d['id'], d['feed_id'])body = '{"status":1,"info":"发布成功","data":{"id":"52","feed_id":"70"}}'resp = json.loads(body, object_hook=Response.object_hook)
print(json.dumps(resp.to_json(), ensure_ascii=False))

上述代码使用了object_hook参数来自定义解码函数,将嵌套的JSON文本映射到对象中。需要注意的是,这种处理方式在嵌套结构较复杂时需要谨慎处理。

多说一句

JSON库是在Python 2.6版中引入的,如果使用的是更早版本的Python,可以通过PyPI获取simplejson库来实现相同的功能。

第三方json库

Demjson

Demjson是一个第三方库,提供了JSON数据的编码和解码功能,同时支持JSONLint的格式化和校验。以下是Demjson的一个简单用法示例:

import demjson# 示例JSON数据
json_data = '{"name": "John", "age": 30, "city": "New York"}'# 解码JSON数据
decoded_data = demjson.decode(json_data)# 打印解码结果
print(decoded_data)

Demjson的decode函数提供了强大的解码功能,还支持通过hook函数进行配置。

Orjson

在处理大量数据时,官方的json库速度较慢,因此我们可以选择使用orjson,一个高效的第三方JSON库。以下是orjson的一个简单示例:

import orjson
from dataclasses import dataclass@dataclass
class Person:name: strage: intjson_data = '{"name": "John", "age": 30}'# 使用 orjson 反序列化 JSON 数据
data_dict = orjson.loads(json_data)# 将字典转换为 Person 对象
person = Person(**data_dict)# 将 Person 对象序列化为 JSON 字符串
serialized_data = orjson.dumps(person)
print(serialized_data.decode())

Orjson相对于官方库在性能上有较大优势,特别是在处理大型数据时。同时,它支持通过option参数进行序列化结果的定制化输出。

Demjson库详解

Demjson是一个功能丰富的第三方JSON库,除了提供基本的编码和解码功能外,还支持JSONLint的格式化和校验。以下是Demjson库的一些高级用法:

import demjson# 示例JSON数据
json_data = '{"name": "John", "age": 30, "city": "New York"}'# 解码JSON数据
decoded_data = demjson.decode(json_data)# 打印解码结果
print(decoded_data)# 使用option参数定制输出格式
formatted_json = demjson.encode(decoded_data, option=demjson.ENCODE_FORMAT)
print(formatted_json)# 使用hook函数处理解码结果
def custom_hook(obj):if 'age' in obj:obj['is_adult'] = obj['age'] >= 18return objdecoded_data_with_hook = demjson.decode(json_data, hook=custom_hook)
print(decoded_data_with_hook)

在上述代码中,我们使用了demjson.ENCODE_FORMAT选项来格式化输出JSON数据,同时使用hook参数自定义了一个解码处理函数。Demjson的这些功能使其在处理特殊需求时非常灵活。

Orjson库的高级选项

Orjson是一个高性能的第三方JSON库,支持多种数据类型的序列化,并提供了一些高级选项用于定制输出结果。以下是Orjson的一些高级用法:

import orjson
from datetime import datetime# 示例JSON数据
data = {"name": "John", "dob": datetime(2020, 5, 1)}# 序列化时使用option参数
serialized_data = orjson.dumps(data, option=orjson.OPT_OMIT_MICROSECONDS)
print(serialized_data.decode())

在上述代码中,我们使用了orjson.OPT_OMIT_MICROSECONDS选项,以自定义序列化结果中日期时间对象的格式。这些高级选项使得Orjson在满足特定需求时更具灵活性。

Python JSON库的兼容性考虑

在实际项目中,我们常常面临着与其他系统或语言进行数据交互的情况,因此兼容性成为一个关键问题。让我们深入探讨一下如何在Python中处理不同数据格式,以确保良好的兼容性。

JSON类型映射

在将JSON数据映射到Python对象时,我们需要注意JSON数据类型与Python数据类型的对应关系。下表展示了JSON类型到Python类型的映射关系:
在这里插入图片描述

JSON类型Python类型
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone

通过了解这些映射关系,我们可以更好地处理JSON数据的解析和转换。

兼容性处理

当我们与其他系统进行数据交互时,可能会遇到不同系统对JSON数据的处理方式有所差异的情况。在这种情况下,我们可以使用一些兼容性处理方法,以确保数据正确传递。

解码时使用object_hook

在Python的JSON库中,object_hook参数可以用于自定义解码函数。通过在解码过程中对数据进行处理,我们可以适应不同系统的数据格式。下面是一个例子:

import jsondef custom_object_hook(d):# 根据实际情况处理解码结果if "status" in d:return Response(d['status'], d['info'], d['data'])else:return ResponseData(d['id'], d['feed_id'])body = '{"status":1,"info":"发布成功","data":{"id":"52","feed_id":"70"}}'resp = json.loads(body, object_hook=custom_object_hook)
print(json.dumps(resp.to_json(), ensure_ascii=False))
处理中文字符编码

在数据交互中,中文字符编码可能成为一个问题。为了解决这个问题,我们可以使用ensure_ascii=False参数,禁用ASCII编码,以保留中文字符的原始形式。

import jsondata = {"name": "张三", "age": 25}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)

多版本兼容

考虑到不同系统或不同版本的JSON库可能存在一些差异,我们在选择使用JSON库时应该留意其兼容性。在项目中使用较为通用的JSON库,或者在需要时进行版本适配,有助于提高项目的可维护性和兼容性。

结语

Python中的JSON处理不仅需要我们熟练掌握基础的编码和解码操作,还需要考虑与其他系统的兼容性。通过了解JSON类型到Python类型的映射关系,以及灵活运用一些兼容性处理方法,我们可以更好地处理不同格式的JSON数据,确保数据在不同系统之间正确传递和解析。在实际项目中,充分考虑兼容性问题将有助于提高代码的健壮性和可维护性。

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

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

相关文章

STM32智能交通灯系统教程

目录 引言环境准备智能交通灯系统基础代码实现:实现智能交通灯系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:交通管理与优化问题解决方案与优化收尾与总结 1. 引言 智能交通灯系统通过STM…

数据精度丢失

js数据精度丢失 最近看面试题想到了之前在开发钟遇到过的问题,现总结一下 在开发过程中,发现从后台返回的数据结构中的id字段在前端显示为不正确的值。经过排查,怀疑是JavaScript中Number类型精度丢失的问题。通过将id字段的类型从Number改为…

朴素模式匹配算法与KMP算法(非重点)

目录 一. 朴素模式匹配算法1.1 什么是字符串的匹配模式1.2 朴素模式匹配算法1.3 通过数组下标实现朴素模式匹配算法 二. KMP算法2.1 算法分析2.2 用代码实现(只会出现在选择题,考察代码的概率不大) 三. 手算next数组四. KMP算法的进一步优化4…

pdf工具

iLovePDF | 为PDF爱好者提供的PDF文件在线处理工具 https://www.ilovepdf.com/zh-cn 图片 pdf 合并成一个pdf也可以拆分

工业三防平板可优化工厂流程管理

在当今高度自动化和数字化的工业生产环境中,工业三防平板正逐渐成为优化工厂流程管理的关键工具。其强大的功能和卓越的性能,为工厂带来了更高的效率、更低的成本以及更出色的质量控制。 工业三防平板,顾名思义,具备防水、防尘、防…

【持续集成_06课_Jenkins高级pipeline应用】

一、创建项目选择pipeline的风格 它主要是以脚本(它自己的语言)的方式进行运行,一般由运维去做的事情,作为测试而言。了解即可。 --- 体现形式全部通过脚本去实现:执行之前(拉取代码)执行&…

萝卜快跑:未来出行的双刃剑

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 在这个日新月异的科技时代,无人驾驶技术正以前所未有的速度改变着我们的出行方式。萝卜快跑,作为自动驾驶出租车领域的佼佼者,其出现无疑为城市交通注入了新的活力&#xff…

入坑树莓派(2)——树莓派4B与手机蓝牙通信

入坑树莓派(2)——树莓派4B与手机蓝牙通信 1、引言 在入坑树莓派(1)中已经搞掂了可视化问题。现在继续开展下一步,尝试与手机通信,一开始是想弄wifi连接的,但发现基于wifi的APP比较难弄,为了降低开发的难度,又因为树莓派板子自带蓝牙模块,所以直接选用蓝牙连接手机…

【数据结构】队列

目录 队列队列的模拟实现队列的链式实现接口实现内部类入队列出队列获取队头元素 但是不删除 判空获取队列元素个数 队列的顺序实现(循环队列)直接使用顺序表的缺陷接口实现成员变量构造器,设置队列长度为 k向循环队列插入一个元素 成功插入则…

IMU用于针对帕金森患者的去震颤餐勺

近期,一项由土耳其科研人员开发的创新成果FiMec智能防颤勺子,为手部震颤患者带来了福音。这款设备运用先进的振动抑制技术和精密的机器人设计,旨在帮助因神经肌肉系统障碍而遭受手颤困扰的人士实现自主进食。 FiMec智能勺子采用两自由度设计…

点云机器学习算法ICP点云配准方法

点云配准(point cloud registration)的目的是将多个三维点云数据集对齐,以形成一个统一的三维模型。其应用范围广泛,包括机器人定位与导航、三维重建、逆向工程、医学成像、环境感知等。点云配准过程可详细划分为初始对齐、最近点查找、变换矩阵计算、应…

【Chatgpt大语言模型医学领域中如何应用】

随着人工智能技术 AI 的不断发展和应用,ChatGPT 作为一种强大的自然语言处理技术,无论是 自然语言处理、对话系统、机器翻译、内容生成、图像生成,还是语音识别、计算机视觉等方面,ChatGPT 都有着广泛的应用前景。特别在临床医学领…

sentinel网关限流配置及使用

sentinel控制台源码:https://download.csdn.net/download/yixin605691235/89543923 sentinel控制台jar包:https://download.csdn.net/download/yixin605691235/89543931 不同环境直接修改jar包中的application.yml文件中的nacos地址就可以了。 一、网关限…

【简历】郑州某二本学院:前端秋招简历指导,简历通过率接近于0

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这是一份二本前端同学的校招简历。25届的二本同学求职方向主要是在小公司,但是这个同学他故意把学校放在简历最后&#xff0…

【Agent】信息提取场景

文章目录 场景说明超参数调整top_ktop_ptemparetureresponse_format 提示词优化提取任务通用提示词模板防止badcase的提示词特殊符合划分待提取内容 提取的后处理评估提取性能Experiment1、通过符号学定位原文信息1.1 首位字符在原文中的index1.2 首尾N个字符,中间字…

24/7/12总结

axios Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 get请求: <script>function…

TypeScript 函数类型 (二)

函数类型 函数有两种方式定义 function 关键字来定义函数 function a(){}表达式定义&#xff08;箭头函数的形式&#xff09; const a()>{}函数需要定义类型的有三个地方 入参 和 返回值 以及 函数本身 的类型, 函数本身的类型常用于表达式定义的函数 function sum(a:stri…

用AI生成Springboot单元测试代码太香了

你好&#xff0c;我是柳岸花开。 在当今软件开发过程中&#xff0c;单元测试已经成为保证代码质量的重要环节。然而&#xff0c;编写单元测试代码却常常让开发者头疼。幸运的是&#xff0c;随着AI技术的发展&#xff0c;我们可以利用AI工具来自动生成单元测试代码&#xff0c;极…

Java小白入门到实战应用教程-开发环境搭建-IDEA2024安装激huo详细教程

writer:eleven 安装IDEA2024 一、下载IDEA 推荐大家去官网下载 我这里也给大家直接准备了安装包&#xff0c;和激huo教程&#xff0c;大家可以自行下载使用。 注意&#xff1a;激huo教程只用于学习交流&#xff0c;不可商用。 IDEA2024安装包及激huo教程 说明&#xff1a…

php随机海量高清壁纸系统源码,数据采集于网络,使用很方便

2022 多个分类随机海量高清壁纸系统源码&#xff0c;核心文件就两个&#xff0c;php文件负责采集&#xff0c;html负责显示&#xff0c;很简单。做流量工具还是不错的。 非第三方接口&#xff0c;图片数据采集壁纸多多官方所有数据&#xff01; 大家拿去自行研究哈&#xff0…