代码之家  ›  专栏  ›  技术社区  ›  user1

将JSON字符串转换为python对象

  •  0
  • user1  · 技术社区  · 7 年前

    我的琴弦

    "{u'currency_id': u'USD', u'company_id': u'Supplier1', u'name': u'New9', u'created_by': u'Administrator', u'created_date': u'2018-07-31 03:24:41'}"
    

    我知道这不是有效的JSON。

    我要做的是首先将这个字符串转换成JSON,然后创建一个Python对象。

    这是我的密码。

    def _decode_list(self, data):
        rv = []
        for item in data:
            if isinstance(item, unicode):
                item = item.encode('utf-8')
            elif isinstance(item, list):
                item = self._decode_list(item)
            elif isinstance(item, dict):
                item = self._decode_dict(item)
            rv.append(item)
        return rv
    
    def _decode_dict(self, data):
        rv = {}
        for key, value in data.iteritems():
            if isinstance(key, unicode):
                key = key.encode('utf-8')
            if isinstance(value, unicode):
                value = value.encode('utf-8')
            elif isinstance(value, list):
                value = self._decode_list(value)
            elif isinstance(value, dict):
                value = self._decode_dict(value)
            rv[key] = value
        return rv
    
    def execute(self, p):
        print(p)
        obj = json.loads(p, object_hook=self._decode_dict)
        print(obj.name) //error
    

    误差

    'unicode' object has no attribute 'name'
    

    问题是,如何将这个JSON转换成python obj。

    在将字符串传递给json.loads()之前,我尝试用双引号替换单引号。但这没什么帮助。

    更新

    @弗朗西斯科·德博贾·桑切斯

    那个链接没有多大帮助。

    def execute(self, p):
        p = str(p).replace("'", '"')
        obj = json.loads(p, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
        print(obj.name)
    

    给出错误

    Extra data: line 1 column 5 - line 1 column 148 (char 4 - 147)
    

    无单引号替换。

    def execute(self, p):
        obj = json.loads(p, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
        print(obj.name)
    

    给出错误

    “unicode”对象没有属性“name”
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Nikos Vita Topiko    7 年前

    ast.literal_eval()

    import ast
    
    def execute(self, p):
        obj = ast.literal_eval(ast.literal_eval(p))
        print(type(obj)) # <- obj is a dict now
        print(obj['name']) # <- prints object name
    
        2
  •  0
  •   Andbeav    7 年前

    def execute(self, p):
        obj = json.loads(p, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
        print(obj.name)
    

    'unicode' object has no attribute 'name'