首页 前端知识 Python将Json转为对象

Python将Json转为对象

2024-06-18 23:06:18 前端知识 前端哥 272 86 我要收藏

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



 

转载请注明出处或者链接地址:https://www.qianduange.cn//article/12719.html
评论
发布的文章
大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!