I may be missing something, so I'd appreciate a correction, but why all that effort when you can use collections.namedtuple and a custom object_hook for json.loads?
import json
from collections import namedtuple
data = '{JSON string goes here}'
fancy_data = json.loads(data, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))