将JSON字符串转换为Python对象

时间:2018-07-31 11:05:53

标签: json python-2.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()之前,我尝试将单引号替换为双引号。但这并没有太大帮助。

更新

@Francisco de Borja Sanchez

该链接没有太大帮助。

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' object has no attribute 'name'

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:0)

如果无法解决您的问题,我深表歉意(我无法发表评论)。根据提供的信息,我看到您在执行此功能之前不会遇到任何错误:

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' 这意味着错误来自打印值“ obj.name”。 这意味着您已经成功将json转换为python对象。 现在,您所需要做的就是弄清楚如何打印名称(也许尝试使用getName()函数或使用obj .__ name)