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操作方法:
-
将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
复制