-3

As title, A json object or convert to a python object like:

u = {
    "name": "john",
    "coat": {
        "color": "red",
        "sex": "man",
    },
    "groups": [
        {"name": "git"},
        {"name": "flask"}
    ]
}

I want visit as:

u.name 

It's easy to do with inherit from dict, but

u.groups.0.name 

We also set it as

u.name = "flask"
u.groups.0.name = "svn"

Thanks

ibuler
  • 13
  • 4

2 Answers2

1

Python is not JavaScript. You need to refer to u["groups"][0]["name"].

Daniel Roseman
  • 588,541
  • 66
  • 880
  • 895
0

May be it's difficult, because integer as key is invalid.

I do like this

class Dict(dict):
    def __init__(self, value):
        if isinstance(value, (list, tuple)):
            value = dict(zip(['_%s' % i for i in range(len(value))], value))
            super(Dict, self).__init__(value)

    def __getattr__(self, key):
        try:
            if type(self.__getitem__(key)) in (dict, OrderedDict, tuple, list):
                return Dict(self.__getitem__(key))
            return self.__getitem__(key)
        except KeyError:
            raise AttributeError(key)

    def __setattr__(self, key, value):
        try:
            return self.__setitem__(key, value)
        except KeyError:
            raise AttributeError(key)
u = {
    "name": "john",
    "coat": {
        "color": "red",
        "sex": "man",
    },
    "groups": [
        {"name": "git"},
        {"name": "flask"}
    ]
}

>>> u = Dict(u)
>>> u.name 
output: john
>>> u.groups._0 
output: {"name": "git"} 
ibuler
  • 13
  • 4