深入探讨Python JSON库:兼容性与高级应用【第34篇—python:JSON库】

文章目录

  • 深入探讨Python中的JSON处理技术
    • 引言
    • 官方json库
    • 进阶用法
      • 多说一句
    • 第三方json库
      • Demjson
      • Orjson
    • Demjson库详解
    • Orjson库的高级选项
    • Python JSON库的兼容性考虑
      • JSON类型映射
      • 兼容性处理
        • 解码时使用`object_hook`
        • 处理中文字符编码
      • 多版本兼容
    • 结语

深入探讨Python中的JSON处理技术

引言

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

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数据,确保数据在不同系统之间正确传递和解析。在实际项目中,充分考虑兼容性问题将有助于提高代码的健壮性和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.8 万 Star!这款 Nginx 可视化配置工具太强了

NginxConfig简介 Nginx Config 是一个强大的 Nginx 配置文件生成器,号称配置 Nginx 服务器所需的唯一工具。 正因为 Nginx 功能强大,所以针对其各个功能的配置项会显得特别多,对于我们来说要记住那么多配置是一件十分头疼的事,甚…

Springboot+vue的校园疫情防控系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的校园疫情防控系统(有报告),Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的校园疫情防控系统,采用M&#xff…

网络原理-初识(1)

目录 网络发展史 独立模式 网络互连 局域网LAN 广域网WAN 网络通信基础 IP地址 概念 格式 端口 概念 格式 认识协议 概念 作用 五元组 网络发展史 独立模式 独立模式:计算机之间相互独立; 网络互连 随着时代的发展,越来越需要计算机之间相互通信,共享软件和数…

【计算机网络】UDP协议与TCP协议

文章目录 一、端口号1.什么是端口号2.端口号范围划分3.认识知名端口号(Well-Know Port Number)4.netstat5.pidof 二、UDP协议1.UDP协议端格式2.UDP的特点3.面向数据报4.UDP的缓冲区5.UDP使用注意事项6.基于UDP的应用层协议 三、TCP协议1.TCP协议段格式1.1理解封装解包和分用1.2…

代码随想录算法训练营第14天 | 二叉树的前序、中序、后序遍历(递归+迭代法)

二叉树的理论基础:(二叉树的种类,存储方式,遍历方式 以及二叉树的定义) https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 二叉树的递归遍历 Leetcode对应的三道习…

使用骨传导耳机对人体有没有伤害?一文读懂骨传导耳机有什么危害?

不能说骨传导耳机对人体没有一点伤害,只能说骨传导耳机可以最大程度的减少对人体的伤害,首先就是骨传导耳机不用入耳,可以减少耳道内细菌的滋生,避免中耳炎等耳部疾病;其次就是骨传导的声音传播方式是通过骨骼直接进入…

Spring Boot 学习之——@SpringBootApplication注解(自动注解原理)

SpringBootApplication注解 springboot是基于spring的新型的轻量级框架,最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 SpringBootApplication//标注在某个类上,表示这个类是SpringBoot…

thinkphp5向数据表插入数据并且获得id

$id db(数据表名)->insertGetId([status>1]); 直接...打印$id就是这条插入的数据的id了

数据采集与预处理01: 项目1 数据采集与预处理准备

数据采集与预处理01: 项目1 数据采集与预处理准备 任务1 认识数据采集技术,熟悉数据采集平台 数据采集:足够的数据量是企业大数据战略建设的基础,因此数据采集成为大数据分析的前站。数据采集是大数据价值挖掘中重要的一环&#…

python-分享篇-养老金数据统计

代码 import matplotlib.pyplot as plt import numpy as np # 为柱状图添加标注 def label(bars):for bar in bars:height bar.get_height()plt.text(bar.get_x()bar.get_width()/2.- 0.2, 1.03*height, %s % int(height))plt.rcParams[font.sans-serif] [SimHei] # 显示中文…

【数据结构】 顺序表的基本操作 (C语言版)

一、顺序表 1、顺序表的定义: 线性表的顺序存储结构,即将表中的结点按逻辑顺序依次存放在一组地址连续的存储单元里。这种存储方式使得在逻辑结构上相邻的数据元素在物理存储上也是相邻的,可以通过数据元素的物理存储位置来反映其逻辑关系。…

基于Springboot的大学生心理健康管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的大学生心理健康管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体…

【吃灰开发板复活】DIY全志V3s随身终端屏幕适配,LVGL以及各种外设驱动移植教程

在上周的文章中介绍了一款因作者想要学习Linux而动手DIY的终端设备V3S-PI, 《梦回2004!我用全志V3s做了个成本100元,功能媲美MP4的随身终端》:梦回2004!我用全志V3s做了个成本100元,功能媲美MP4的随身终端…

微信小程序如何获取当前日期时间

Hello大家好!我是咕噜铁蛋,获取当前日期时间是小程序中经常会用到的一个功能。因此,在本文中,我通过科技手段给大家收集整理了下,今天我将向大家介绍如何在微信小程序中获取当前日期时间的方法,并分享一些实…

HubSpot在线客户互动:建立强大数字连接的关键一步

HubSpot在线客户互动为企业带来了多方面的具体业务优势,其中一些关键点包括: 提高销售转化率: 通过实时在线聊天、个性化推荐等互动方式,HubSpot使企业能够更主动地接触潜在客户,解答其疑问,提供定制化的…

RabbitMQ——高级篇

目录 一、MQ的常见问题 二、消息可靠性问题 生产者消息确认 消息持久化 消费者消息确认 失败重试机制 三、死信交换机 简介死信交换机 TTL超时机制 延迟队列 四、惰性队列 消息堆积问题 惰性队列 一、MQ的常见问题 消息可靠性问题:如何确保发送的…

解决 Git:ssh: connect to host github.com port 22: Connection timed out 问题的三种方案

1、问题描述: 其一、整体提示为: ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository. 中文为: ssh:连接到主机 github.com 端口 22:连接超时 fatal&a…

【设计模式】腾讯面经:原型模式怎么理解?

什么是原型模式? 设计模式是编程世界的基石,其中原型模式无疑是一种常用而又高效的创建对象的手段。那么,什么是原型模式呢?又该如何去实现它? 在软件工程中,原型模式是一种创建型设计模式。我们可以这样…

「JavaSE」抽象类接口2

🎇个人主页:Ice_Sugar_7 🎇所属专栏:快来卷Java啦 🎇欢迎点赞收藏加关注哦! 抽象类&接口2 🍉接口间的继承🍉接口的应用🍉总结 🍉接口间的继承 和类的继承…

Pyside6中QTableWidget使用

目录 一:介绍: 二:演示 一:介绍: 在 PySide6 中,QTableWidget 是一个用于展示和编辑表格数据的控件。它提供了在窗口中创建和显示表格的功能,并允许用户通过单元格来编辑数据。 要使用 QTabl…