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函数进行配置。详细信息可以在 Demjson的GitHub地址 上找到。

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.mzph.cn/news/869456.shtml

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

相关文章

生日判断星座【GO】

文章目录 星座列表生日转换为星座 星座列表 const (Aries "aries"Taurus "taurus"Gemini "gemini"Cancer "cancer"Leo "leo"Virgo "virgo"Libra "libra&q…

小红书后端

牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com) 小红书推荐系统 题目: 思路: 尝试(标题4) import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息…

FFmpeg 实现从麦克风获取流并通过RTMP推流

使用FFmpeg库实现从麦克风获取流并通过RTMP推流,FFmpeg版本为4.4.2-0。RTMP服务器使用的是SRS,我这边是跑在Ubuntu上的,最好是关闭掉系统防火墙。拉流端使用VLC。如果想要降低延时,请看我另外一篇博客,里面有说降低延时…

github 下载提速的几种方法

1. 代理下载(无需注册) //toolwa.com/github/ //d.serctl.com/2. 转入 Gitee 加速 将项目镜像到 Gitee 中下载加速 3. 使用 Watt Toolkit 加速 Watt Toolkit //steampp.net/选择合适的版本下载 选择 github,一键加速 4.CDN 加速 (修改…

html转markdown nodejs实现

用到了jsdom库,直接现成处理html标签结构,只需要关心format格式化样式即可。 比较简易,待后续优化,目前只是短时间批量转换html文件。 const { JSDOM } require(jsdom);const getText (htmlString) > {if (!htmlString) re…

浏览器开发者视角及CSS表达式选择元素

点击想要查看的接口,然后点击检查,便可以切换到该接口对应的html代码 如果F12不起作用的话,点击更多工具,然后选择开发者工具即可 ctrlF可以去查阅相关的CSS表达式选择元素 如果没有加#t1,那么表示的是选择所有的p 使用…

图解HTTP(5、与 HTTP 协作的 Web 服务器 6、HTTP 首部)

5、与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率。 用单台虚拟主机实现多个域名 在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此…

Linux-多线程

线程的概念 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中…

Labview_压缩文件

调用顺序 源文件 生成后的文件 1.新建ZIP文件 生成ZIP文件的路径:为最终生成ZIP文件的路径,需要提供ZIP文件的名称和类型 2.添加文件到压缩文件 源文件路径:为需要压缩的文件路径,非文件夹路径 生成ZIP文件时的路径&#x…

Elasticsearch 缓存策略详解:优化你的搜索体验

目录 1. Elasticsearch缓存机制概述 2. 缓存机制的详细解析 2.1 节点查询缓存 2.2 分片请求缓存 2.3 字段数据缓存 2.4 分片查询缓存 3. 合理缓存比例设置 3.1 节点查询缓存 3.2 分片请求缓存 3.3 字段数据缓存 3.4 分片查询缓存 4. 缓存监控与调优 5.实战调优 5…

区域特征检测工具的使用

区域特征检测工具的使用 选择区域-》右键-》工具->特征检测

实践致知第12享:如何新建一个Word并设置格式

一、背景需求 小姑电话说:要新建一个Word文档,并将每段的首行设置空2格。 二、解决方案 1、在电脑桌面上空白地方,点击鼠标右键,在下拉的功能框中选择“DOC文档”或“DOCX文档”都可以,如下图所示。 之后&#xff0…

Js- Math对象

1.对应的方法 Math.abs(x):返回 x 的绝对值。Math.ceil(x):返回大于或等于 x 的最小整数(向上取整)。Math.floor(x):返回小于或等于 x 的最大整数(向下取整)。Math.round(x):返回 x…

(图文详解)小程序AppID申请以及在Hbuilderx中运行

今天小编给大家带来了如何去申请APPID,如果你是小程序的开发者,就必须要这个id。 申请步骤 到小程序注册页面,注册一个小程序账号 微信公众平台 填完信息后提交注册 会在邮箱收到 链接激活账号 确认。邮箱打开链接后,会输入实…

一、openGauss详细安装教程

一、openGauss详细安装教程 一、安装环境二、下载三、安装1.创建omm用户2.授权omm安装目录3.安装4.验证是否安装成功5.配置gc_ctl命令 四、配置远程访问1.配置pg_hba.conf2.配置postgresql.conf3.重启 五、创建用户及数据库 一、安装环境 Centos7.9 x86openGauss 5.0.1 企业版…

nvm下载

nvm下载 1.下载nvm安装包2.安装nvm3.修改settings.txt4.安装成功5.继续配置 下载nvm之前,你最好将你电脑上的node卸载掉,直接在winx中卸载就行 1.下载nvm安装包 https://github.com/coreybutler/nvm-windows/releases 2.安装nvm 3.修改settings.txt root: E:\nvm\install\nv…

Golang | Leetcode Golang题解之第225题用队列实现栈

题目: 题解: type MyStack struct {queue []int }/** Initialize your data structure here. */ func Constructor() (s MyStack) {return }/** Push element x onto stack. */ func (s *MyStack) Push(x int) {n : len(s.queue)s.queue append(s.queu…

Elasticsearch 8 支持别名查询

在 Elasticsearch 8 中,使用 Java 高级 REST 客户端进行别名管理的过程与之前的版本类似,但有一些API细节上的变化。以下是如何使用 Java 和 Elasticsearch 8 进行别名操作的例子: 引入依赖 确保你的项目中包含了 Elasticsearch 的高级 RES…

关于利用C/C++ 利用编译器RAII机制,在多种编译器及跨平台下得兼容性问题。

在C/C 之中,我们常常利用RAII机制,来处理某个临时块得初始、及利用编译器自动析构,但这可能存在一定的致命性风险,如果你没有遇到,只是你没有过多的进行了解,挨得毒打太小,导致的。 举几个小例子…

08.C2W3.Auto-complete and Language Models

往期文章请点这里 目录 N-Grams: OverviewN-grams and ProbabilitiesN-gramsSequence notationUnigram probabilityBigram probabilityTrigram ProbabilityN -gram probabilityQuiz Sequence ProbabilitiesProbability of a sequenceSequence probability shortcomingsApproxi…