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