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

news2024/9/22 3:52:28

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

官方json库

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

import json

print(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 StringIO

class ResponseData:
    def __init__(self, id, feed_id):
        self.id = id
        self.feed_id = feed_id

class Response:
    def __init__(self, status=None, info=None, data=None):
        self.status = status
        self.info = info
        self.data = data

    def to_json(self):
        return {
            "status": self.status,
            "info": self.info,
            "data": self.data.__dict__ if self.data else None
        }

    @staticmethod
    def 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: str
    age: int

json_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'] >= 18
    return obj

decoded_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 json

def 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 json

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

多版本兼容

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

结语

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

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

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

相关文章

【区块链 + 智慧政务】中国铁塔区块链委托代征开票应用 | FISCO BCOS应用案例

中国铁塔是全球规模最大的通信铁塔基础设施服务提供者。通信塔站址点多面广,业主构成复杂,因此产生海量税务、合同、票据等信息。为进一步提高场租或供电取票的及时性和规范性,严格遵循税务相关的要求,中国铁塔采用国产开源联盟链…

python--实验12

目录 知识点 第一部分:文件概述 第二部分:文件的基本操作 第三部分:目录管理 第四部分:CSV文件读写 第五部分:openpyxl等模块 小结 实验 知识点 第一部分:文件概述 文件标识:找到计算机…

尚硅谷大数据技术-数据湖Hudi视频教程-笔记03【Hudi集成Spark】

大数据新风口:Hudi数据湖(尚硅谷&Apache Hudi联合出品) B站直达:https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘:https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

【ARM】MDK-服务器与客户端不同网段内出现卡顿问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录不同网段之间的请求发送情况以及MDK网络版license文件内设置的影响。 2、 问题场景 客户使用很久的MDK网络版,在获取授权时都会出现4-7秒的卡顿,无法对keil进行任何操作,彻底…

Mac 如何安装vscode

Mac 电脑/ 苹果电脑如何安装 vscode 下载安装包 百度搜索vscode,即可得到vscode的官方下载地址:https://code.visualstudio.com/ 访问网页,点击下载即可。 下载完成后,得到下图所示的app。 将该 app 文件,放入到…

CV11_模型部署pytorch转ONNX

如果自己的模型中的一些算子,ONNX内部没有,那么需要自己去实现。 1.1 配置环境 安装ONNX pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple 安装推理引擎ONNX Runtime pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/si…

基于STM32设计的超声波测距仪(微信小程序)(186)

基于STM32设计的超声波测距仪(微信小程序)(186) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献1.4 开发工具的选择1.5 系统框架图…

WebSocket、服务器推送技术

WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议,它可以让客户端和服务器之间进行实时的双向通信,且不存在同源策略限制 WebSocket 使用一个长连接,在客户端和服务器之间保持持久的连接,从而可以实时地发送和接收数据…

实现给Nginx的指定网站开启basic认证——http基本认证

一、问题描述 目前我们配置的网站内容都是没有限制,可以让任何人打开浏览器都能够访问,这样就会存在一个问题(可能会存在一些恶意访问的用户进行恶意操作,直接访问到我们的敏感后台路径进行操作,风险就会很大&#xff…

如何在excel表中实现单元格满足条件时整行变色?

可以试试使用条件格式: 一、条件格式 所谓“自动变色”就要使用条件格式。 先简单模拟数据如下, 按 B列数字为偶数 为条件,整行标记为蓝色背景色。 可以这样设置: 先选中1:10行数据,在这里要确定一下名称栏里显示…

数据的力量:Facebook如何通过数据分析驱动创新

在当今数字化和信息化的时代,数据被认为是推动企业创新和发展的关键因素之一。作为全球最大的社交媒体平台,Facebook不仅积累了庞大的用户数据,还利用先进的数据分析技术,不断探索和实现新的创新。本文将深入探讨Facebook如何通过…

Golang中读写锁的底层实现

目录 Sync.RWMutex 背景与机制 接口简单介绍 sync.RWMutex 数据结构 读锁流程 RLock RUnlock RWMutex.rUnlockSlow 写锁流程 Lock Unlock Sync.RWMutex 背景与机制 从逻辑上,可以把 RWMutex 理解为一把读锁加一把写锁; 写锁具有严格的排他性&…

Spring之事务管理TranscationManager(大合集)

原子性 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 一致性 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性 一个事务的执行不能被其他事务干扰。 持续性 一…

人工智能算法工程师(中级)课程12-PyTorch神经网络之LSTM和GRU网络与代码详解1

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程12-PyTorch神经网络之LSTM和GRU网络与代码详解。在深度学习领域,循环神经网络(RNN)因其处理序列数据的能力而备受关注。然而,传统的RNN存在梯度消失和梯度爆炸的问题,这使得它在长序列任务中的表现不尽…

【Git分支管理】理解分支 | 创建分支 | 切换分支 | 合并分支 | 删除分支 | 强制删除分支

目录 前言 0.理解分支 1.查看本地仓库存在的分支 2.HEAD指向分支 3.创建本地分支 4.切换分支 5.分支提交操作 6.合并分支 快进模式Fast-forward 7.删除分支 8.强制删除分支 本篇开始介绍下Git提供的杀手级的功能:分支管理 先提交再合并 前言 在玄幻武侠…

IP-Guard日志数据上传至 SYSLOG 服务器操作指南

一、功能简介 服务器支持把日志数据上传到 SYSLOG 服务器。 二、功能配置 2.1 数据目录移交设置 在服务器安装目录下 OServer3.ini 文件中,添加工具启动配置,配置五分钟内生效。 Path:设置移交目录路径,IPG 服务器会把收集完成的…

Redis④ —— 高可用

1. 主从复制 一主多从模式,采用读写分离的方式主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令。主从服务器之间的命令…

jvm常用密令、jvm性能优化、jvm性能检测、Java jstat密令使用、Java自带工具、Java jmap使用

1.jps是Java虚拟机的进程状态工具,用于列出正在运行的Java进程 jps命令的使用:cmd打开直接jps 1.1不带参数: jps 默认情况下,列出所有正在运行的 Java 进程的进程 ID 和主类名。 1.2 -l:显示完整的主类名或 JAR 文件…

《故障复盘 · 数据库连接异常关闭》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

不开放80或443端口也能申请IP SSL证书!

在申请SSL/HTTPS证书时,如果不方便使用域名或者没有域名,就要申请一种特殊的SSL证书——IP SSL证书。但是一般的IP地址证书签发过程中,需要短暂开放80或者443端口才能签发成功。那么问题来了,有的实在不能开放80或者443端口&#…