Skip to content

Instantly share code, notes, and snippets.

@m0xb
Created September 18, 2017 05:57
Show Gist options
  • Select an option

  • Save m0xb/3ab2d5dae1050a6f7baeebba18f95745 to your computer and use it in GitHub Desktop.

Select an option

Save m0xb/3ab2d5dae1050a6f7baeebba18f95745 to your computer and use it in GitHub Desktop.
import json
class ObjectEncoder(json.JSONEncoder):
def default(self, o):
return o.__dict__
class Address:
def __init__(self, street, city, state, zip):
self.street = street
self.city = city
self.state = state
self.zip = zip
@staticmethod
def from_dict(address_dict):
'''
Makes an Address object from a dict instance that was decoded from JSON
usage: Address.from_dict(...)
'''
street = address_dict['street']
city = address_dict['city']
state = address_dict['state']
zip = address_dict['zip']
return Address(street, city, state, zip)
def __repr__(self):
return f"Address({self.street}, {self.city}, {self.state} {self.zip})"
class Person:
def __init__(self, name, addresses):
self.name = name
self.addresses = addresses
@staticmethod
def from_dict(person_dict):
'''
Makes a Person object from a dict instance that was decoded from JSON
usage: Person.from_dict(...)
'''
name = person_dict['name']
addresses = []
for address_dict in person_dict['addresses']:
addresses.append(Address.from_dict(address_dict))
return Person(name, addresses)
def __repr__(self):
return f"Person({self.name}, {self.addresses})"
filename = 'person1.json'
with open(filename, 'w') as fp:
json.dump(Person('Dude Duderson', [Address('1600 Pennsylvania Ave NW', 'Washington', 'DC', 20500)]), fp, cls=ObjectEncoder)
with open(filename, 'r') as fp:
person_dict = json.load(fp)
print(f"person_dict: {person_dict}")
p = Person.from_dict(person_dict)
print(f"Person: {p}")
@m0xb
Copy link
Author

m0xb commented Sep 18, 2017

Output:

person_dict: {'name': 'Dude Duderson', 'addresses': [{'street': '1600 Pennsylvania Ave NW', 'city': 'Washington', 'state': 'DC', 'zip': 20500}]}
Person: Person(Dude Duderson, [Address(1600 Pennsylvania Ave NW, Washington, DC 20500)])

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment