Python使用.json作为类实例的配置文件

Python使用.json作为类实例的配置文件,python,json,class,object,config,Python,Json,Class,Object,Config,我正在创建一个将其配置存储在字典中的应用程序。我知道我可以将其写入JSON文件,并在每次应用程序启动时读取。但问题是这本词典也包含对象。类似于此(LED是一个导入的模块,类为APALedstrip和Arduino) 我很好奇,是否也可以像这样将其存储在JSON文件中?当导入到字典中时,对象仍然被创建?您需要序列化对象。一种方法是使用“pickle” Pickle将对象转换为字节,因此下一步是使用base64将它们转换为字符串 我选择base64是因为它对于非ASCII字符是安全的 为了自动保存和

我正在创建一个将其配置存储在字典中的应用程序。我知道我可以将其写入JSON文件,并在每次应用程序启动时读取。但问题是这本词典也包含对象。类似于此(LED是一个导入的模块,类为APALedstrip和Arduino)


我很好奇,是否也可以像这样将其存储在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')
    }
}