AmericanMade AmericanMade - 1 year ago 64
Python Question

How to save a dictionary of objects in Python?

I have a Python 3.5 program that creates an inventory of objects. I created a class of Trampolines (color, size, spring, etc.). I constantly will create new instances of the class and I then save a dictionary of them. The dictionary looks like this:

my_dict = {name: instance} and the types are like so {"string": "object"}

MY ISSUE is that I want to know how to save this inventory list so that I can start where I left off the last time I closed the program.

I don't want to use "pickle" because I'm trying to learn secure ways to do this for more important versions in the future.

I thought about using SQLite3, so any tips on how to do this easily would be appreciated.

My preferred solution would state how to do it with the "json" module. I tried it, but the error I got was

__main__.Trampoline object at 0x00032432... is not JSON serializable


Below is the code I used when I got the error:

out_file = open(input("What do you want to save it as? "), "w")
json.dump(my_dict, out_file, indent=4)


I've done a good amount of research, and saw that there's also an issue with many of these SAVE options that you can only do ONE object per 'save file', but that the work around to this is that you use a dictionary of objects, such as the one I made. Any info clarifying this would be great, too!


cmd cmd
Answer Source

Here is an example of a class that handles datetime objects.

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            if obj.tzinfo:
                obj = obj.astimezone(isodate.tzinfo.UTC).replace(tzinfo=None)
            return obj.isoformat()[:23] + 'Z'
        return json.JSONEncoder.default(self, obj)

then where you use json.dumps:

json.dumps(obj, cls=CustomEncoder)