Python将Json转为对象

1、Json简介

JSON(JavaScript Object Notation)是一种用于数据交换的轻量级文本格式,易于人们阅读和编写,也易于机器解析和生成。它基于JavaScript的一个子集,但它的语法独立于编程语言。

JSON被广泛应用于前后端数据交互、API接口的数据传输等场景中。在Python中,可以使用json模块来处理JSON数据。该模块提供了将Python对象转换为JSON字符串(json.dumps())以及将JSON字符串转换为Python对象(json.loads())的方法。

拓展:

JSON5是一种扩展了JSON语法的数据格式,它允许在JSON中使用注释、末尾的逗号、单引号等特性。JSON5的目标是在保持JSON简洁性的基础上,增加一些方便开发人员阅读和编写的特性。

JSON5与JSON语法上基本相同,但是允许更多的灵活性和可读性。例如,JSON5允许使用单引号包裹字符串,允许在字符串中出现换行符,允许在对象和数组的末尾使用逗号,允许使用注释等。

JSON5的优点在于它增加了对开发人员的友好性,使得JSON更容易被读懂和编写。它遵循JavaScript的语法风格,使得开发人员可以更容易地将JSON转换为JavaScript对象或将JavaScript对象转换为JSON。

2、python使用json

Python中内置JSON库,可以很方便地进行数据的序列化和反序列化。下面是一些常用的JSON操作方法:

  1. 将Python对象转换为JSON字符串:

import json

data = {'name': 'John', 'age': 30, 'city': 'New York'}
json_str = json.dumps(data)
print(json_str)
 

        2.将JSON字符串转换为Python对象:

import json

json_str = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_str)
print(data)
 

        3.将Python对象直接写入JSON文件:

import json

data = {'name': 'John', 'age': 30, 'city': 'New York'}
with open('data.json', 'w') as file:
    json.dump(data, file)
 

        4.从JSON文件中读取Python对象:

import json

with open('data.json', 'r') as file:
    data = json.load(file)
print(data)
 

3、json转为对象

上一节演示了如何使用json转对象,但json.load()本质只是把json转为字典,而不是对象。如果需要使用某个字典的字典,只能使用dict['key']的方式获取,而不能使用obj.key方式。

那么,如何将json转为真正的对象呢?

最简单的是,通过获取dict每个属性的值,再依次传递给对象构造函数

import josn

class ReqLogin:
    def __init__(self, name):
        self.name = name

data_json = '{"name": "jforgame"}'

def json_to_person(json_str):
    json_dict = json.loads(json_str)
    return ReqLogin(json_dict['name'])

print(json_to_person(data_json).name)
如果只是一个对象,这样写也没什么问题。关键是,如果对象的类型非常多,这样写就显得非常啰嗦了。

为了适应每一种消息类型,我们可以使用一个消息工厂,缓存所有消息类型。例如:

class MessageFactory:

    def __init__(self):
        self.msg_dict = {}

    def register(self, msgId, msgClass):
        self.msg_dict[msgId] = msgClass

    def get_message_class(self, msgId):
        return self.msg_dict.get(msgId)

    def create_message(self, msg_id, json_str):
        msg_class = self.get_message_class(msg_id)

        if msg_class:
            json_to_dict = json.loads(json_str)
            msg = msg_class(**json_to_dict)
            return msg
        else:
            return None

将每一种消息的类型都缓存起来,使用的时候,只需传入目标消息的id以及对应的json数据,即可转换为对应的对象。使用演示

import json

class MessageFactory:

    def __init__(self):
        self.msg_dict = {}

    def register(self, msgId, msgClass):
        self.msg_dict[msgId] = msgClass

    def get_message_class(self, msgId):
        return self.msg_dict.get(msgId)

    def create_message(self, msg_id, json_str):
        msg_class = self.get_message_class(msg_id)

        if msg_class:
            json_to_dict = json.loads(json_str)
            msg = msg_class(**json_to_dict)
            return msg
        else:
            return None

class ReqLogin:
    def __init__(self, name):
        self.name = name


class ReqUseItem:
    def __init__(self, itemId, quantity):
        self.itemId = itemId
        self.quantity = quantity

msgFactory = MessageFactory()
msgFactory.register(1, ReqLogin)
msgFactory.register(2, ReqUseItem)

data_json1 = '{"name": "jforgame"}'
data_json2= '{"itemId": "1001","quantity": "11"}'


obj = msgFactory.create_message(1, data_json1)
obj2 = msgFactory.create_message(2, data_json2)

print(obj.name) # jforgame
print(obj2.itemId) # 1001



 

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

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

相关文章

SpringBoot集成Kafka开发

4.SpringBoot集成Kafka开发 4.1 创建项目 4.2 配置文件 application.yml spring:application:name: spring-boot-01-kafka-basekafka:bootstrap-servers: 192.168.2.118:90924.3 创建生产者 package com.zzc.producer;import jakarta.annotation.Resource; import org.spri…

MATLAB 数据输出

MATLAB 数据输出 数据导出(或输出)在 MATLAB 的意思是写入文件。MATLAB 允许您在另一个读取 ASCII 文件的应用程序中使用您的数据。为此,MATLAB 提供了几个数据导出选项。 您可以创建以下类型的文件- 数组中的矩形、分隔的ASCII数据文件。 击键的日记&#xff08…

Linux系统安装Redis7(详细版)

Linux系统安装Redis7 一、windows安装redis二、Linux安装Redis下载redis编辑redis7.conf文件启动redis-server服务如何关闭redis服务设置Redis开机自启动 一、windows安装redis Window 下安装 下载地址:https://github.com/dmajkic/redis/downloads 下载到的Redi…

6.k8s中的secrets资源

一、Secret secrets资源,类似于configmap资源,只是secrets资源是用来传递重要的信息的; secret资源就是将value的值使用base64编译后传输,当pod引用secret后,k8s会自动将其base64的编码,反编译回正常的字符…

OpenCV(一) —— OpenCV 基础

1、OpenCV 简介 OpenCV(Open Source Computer Vision Library)是一个基于 BSD 许可开源发行的跨平台的计算机视觉库。可用于开发实时的图像处理、计算机视觉以及模式识别程序。由英特尔公司发起并参与开发,以 BSD 许可证授权发行&#xff0c…

【QT学习】14.线程学习

一。线程了解 线程是计算机科学中的一个重要概念,它是操作系统能够进行运算调度的最小单位。线程是进程中的一个执行流,一个进程可以包含多个线程。与进程相比,线程更轻量级,可以更高效地利用计算机资源。 线程有以下几个特点&…

vue3+ts 原生 js drag drop 实现

vue3ts 原生 js drag drop 实现 一直以来没有涉及的一个领域就是 drag drop 拖动操作,研究了下,实现了,所以写个教程。 官方说明页面及实例:https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API 最终效果&…

企业计算机服务器中了lockbit勒索病毒如何处理,lockbit勒索病毒解密流程建议

在虚拟的网络世界里,人们利用网络获取信息的方式有很多,网络为众多企业提供了极大便利性,也大大提高了企业生产运营效率,方便企业开展各项工作业务。但随着网络技术的不断发展与应用,越来越多的企业开始关注企业网络数…

Flutter笔记:Widgets Easier组件库(8)使用图片

Flutter笔记 Widgets Easier组件库(8):使用图片 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress o…

使用递归函数,将一串数字每位数相加求和

代码结果&#xff1a; #include<stdio.h> int DigitSum(unsigned int n) {if (n > 9)return DigitSum(n / 10) (n % 10);elsereturn n; } int main() {unsigned int n;scanf("%u", &n);int sum DigitSum(n);printf("%d\n", sum);return 0; …

C语言/数据结构——每日一题(合并两个有序链表)

一.前言 嗨嗨嗨&#xff0c;大家好久不见&#xff01;今天我在LeetCode看到了一道单链表题&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists想着和大家分享一下&#xff0c;废话不多说&#xff0c;让我们开始今天的题目分享吧。 二.正文 1.1题目描述 1.2题…

Javascript:Web APIs(二)

JavaScript&#xff1a;Web APIs&#xff08;一&#xff09; 在上篇文章&#xff0c;我们学习了对BOM对象的一些基本操作&#xff0c;但即使这样&#xff0c;我们也只是能通过js改变元素属性&#xff0c;而不能进行网页的交互效果和动态效果&#xff0c;这时我们就不得不提到事…

Spring Cloud——LoadBalancer

Spring Cloud——LoadBalancer 一、负载均衡&#xff08;LoadBalance&#xff09;1.LoadBalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 二、LoadBalancer1.Spring RestTemplate as a LoadBalancer Client2.编码使用DiscoveryClient动态获取所有上线的服务列表3.从默认…

QT5之lambda+内存回收机制

使用lambda需要 配置c11 所以在点.pro文件里面配置添加如下 CONFIG c11 使用到qDebug 打印包含头文件 #include<QDebug> lambda 表达式使用 代替槽如下 #include "mainwidget.h" #include<QPushButton> #include<QDebug> mainWidget::mainWid…

探索AI工具的巅峰:个人体验与深度剖析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.4--汇编LED驱动程序

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

省级财政收入、支出、第一、二、三产业增加值、工业增加值、金融业增加值占GDP比重数据(1978-2022年)

01、数据介绍 财政收支作为国家治理的基础&#xff0c;越来越受到社会各界的关注。同时&#xff0c;产业结构的优化与升级也是中国经济持续增长的关键因素。本数据对中国省级财政收入、支出占GDP的比重以及第一、二、三产业的增加值占GDP的比重和工业增加值占GDP的比重、金融业…

Python量化炒股的财务因子选股—质量因子选股

Python量化炒股的财务因子选股—质量因子选股 在Python财务因子量化选股中&#xff0c;质量类因子有2个&#xff0c;分别是净资产收益率和总资产净利率。需要注意的是&#xff0c;质量类因子在财务指标数据表indicator中。 净资产收益率&#xff08;roe&#xff09;选股 净资…

创建codereview

创建codereview流程 一、开始创建二、选择分支三、添加细节 一、开始创建 点击codereivew按钮 为新的codereview选择一个工程后点击create review 二、选择分支 选择目标分支和要比对的分支&#xff0c;比如develop 三、添加细节 Add branch后&#xff0c;可以继续Edit …

如何反向查看某个命令所属的rpm包的2个方法?(rpm -qf `which xxx`和yum provides和 rpm -ql xxx.rpm)

文章目录 快速回忆方法1&#xff1a; rpm -qf方法2&#xff1a;yum provides 其他rpm如何查看某个rpm包里面包含哪些命令: rpm -ql主推方法1&#xff1a; rpm -ql方法2&#xff1a;yum info 其他查看rdma-core中包含哪些cmd&#xff1a;一些其他命令所在包探索 快速回忆 rpm -…
最新文章