Python使用.json作为类实例的配置文件
我正在创建一个将其配置存储在字典中的应用程序。我知道我可以将其写入JSON文件,并在每次应用程序启动时读取。但问题是这本词典也包含对象。类似于此(LED是一个导入的模块,类为APALedstrip和Arduino)Python使用.json作为类实例的配置文件,python,json,class,object,config,Python,Json,Class,Object,Config,我正在创建一个将其配置存储在字典中的应用程序。我知道我可以将其写入JSON文件,并在每次应用程序启动时读取。但问题是这本词典也包含对象。类似于此(LED是一个导入的模块,类为APALedstrip和Arduino) 我很好奇,是否也可以像这样将其存储在JSON文件中?当导入到字典中时,对象仍然被创建?您需要序列化对象。一种方法是使用“pickle” Pickle将对象转换为字节,因此下一步是使用base64将它们转换为字符串 我选择base64是因为它对于非ASCII字符是安全的 为了自动保存和
我很好奇,是否也可以像这样将其存储在JSON文件中?当导入到字典中时,对象仍然被创建?您需要序列化对象。一种方法是使用“pickle” Pickle将对象转换为字节,因此下一步是使用base64将它们转换为字符串 我选择base64是因为它对于非ASCII字符是安全的 为了自动保存和检索房间,请使用 保存房间()和检索房间() 此外,我实现了逻辑,因此只要保持结构不变,就可以保存房间的任何变化 前
为什么要添加base64编码?picke返回字节,所以我们需要将其转换为字符串,如果我们只存储ASCII,那么这是不必要的,但由于我不知道对象是什么,我认为它更安全…为什么需要将其转换为字符串?为了将其保存为JSON文件。。。据我所知,json只接受unicode字符串。有更好的方法吗?啊,我想我明白你现在的建议了,但是,你必须手动保留一些逻辑来知道哪些键是用来引用序列化字节的,你可能应该指出这一点。
rooms['livingroom'] = {
"room":data.room(name = 'livingroom',dataKeys = dataKeys),
"lights":{
"LedStrip":LED.APALedstrip(name = 'livingroom',
room = 'livingroom')
}
}
rooms['bed'] = {
"room":data.room(name = 'bed', dataKeys = dataKeys),
"lights":{
"LedStrip":LED.Arduino(name ='bed',
serialPort = 'ttyUSB0',
room = 'livingroom',
master = {'room':'livingroom', 'light':'LedStrip'},
roomSensors = 'livingroom')
}
}
import codecs
import json
import pickle
def save_rooms(rooms):
for room in rooms:
# find all LedStrip objects
if 'lights' in rooms[room] and 'LedStrip' in rooms[room]['lights']:
lights = rooms[room]['lights']['LedStrip']
# encode object to bytes with pickle and then to string with base64
rooms[room]['lights']['LedStrip'] = codecs.encode(pickle.dumps(lights),
"base64").decode()
with open("rooms.json", "w") as f:
json.dump(rooms, f)
def retrieve_rooms():
with open("rooms.json") as f:
rooms = json.load(f)
for room in rooms:
# find all LedStrip objects
if 'lights' in rooms[room] and 'LedStrip' in rooms[room]['lights']:
lights = rooms[room]['lights']['LedStrip']
# decode from string to bytes with base64 and then from bytes to object with pickle
rooms[room]['lights']['LedStrip'] = pickle.loads(codecs.decode(lights.encode(), "base64"))
return rooms
rooms = {}
rooms['livingroom'] = {
"room": data.room(name='livingroom', dataKeys=dataKeys),
"lights": {
"LedStrip": LED.APALedstrip(name='livingroom',
room='livingroom')
}
}
rooms['bed'] = {
"room": data.room(name='bed', dataKeys=dataKeys),
"lights": {
"LedStrip": LED.Arduino(name='bed',
serialPort='ttyUSB0',
room='livingroom',
master={'room': 'livingroom', 'light': 'LedStrip'},
roomSensors='livingroom')
}
}
save_rooms(rooms)
loaded_rooms = retrieve_rooms()
rooms['kitchen'] = {
"room": data.room(name='kitchen', dataKeys=dataKeys),
"lights": {
"LedStrip": LED.APALedstrip(name='kitchen',
room='kitchen')
}
}