markhu
10/16/2014 - 7:40 AM

edict: load JSON into Python object but access with .dot notation

edict: load JSON into Python object but access with .dot notation

class edict(dict):  # Similar to bunch, but less, and JSON-centric
    # based on class dotdict(dict):  # from http://stackoverflow.com/questions/224026/dot-notation-for-dictionary-keys
    
    __setattr__= dict.__setitem__  # TBD: support assignment of nested dicts by overriding this?
    __delattr__= dict.__delitem__

    def __init__(self, data):
        if type(data) in ( unicode, str ):
            data = json.loads( data)
    
        for name, value in data.iteritems():
            setattr(self, name, self._wrap(value))

    def __getattr__(self, attr):
        return self.get(attr, None)

    def _wrap(self, value):  # from class Struct by XEye '11 http://stackoverflow.com/questions/1305532/convert-python-dict-to-object
        if isinstance(value, (tuple, list, set, frozenset)):
            return type(value)([self._wrap(v) for v in value])  # recursion!
        else:
            if isinstance(value, dict):
                return edict(value)  # is there a relative way to get class name?
            else:
                return value

# optional handy member function(s): pretty-printer, ... left as an exercise for the reader...
# def subset(self, only_keys=[], exclude_keys=[], as='json', indent=2, separators=(',',':')):

# EOF