【发布时间】:2018-07-31 11:05:52
【问题描述】:
我的字符串
"{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'
【问题讨论】:
-
也许已经在这里回答了:stackoverflow.com/questions/6578986/…
-
@FranciscodeBorjaSanchez 该链接没有多大帮助。我用调查结果更新了我的问题
-
这已经是一个完全有效的 Python 字典了。为什么不直接用
ast.literal_eval加载呢? -
@blhsing 我试过 ast.literal_eval() 但没有帮助。
标签: json python-2.7