【问题标题】:Convert JSON string into Python object将 JSON 字符串转换为 Python 对象
【发布时间】: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


【解决方案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

【讨论】:

  • 打印 '' 和错误 - “字符串索引必须是整数,而不是 str”
  • 你的字符串是什么?
  • "{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'}"
  • 这是一个实际的字符串吗?还是字典的印刷品?你能打印 type(p) 吗?
  • print(type(obj)) ---->
【解决方案2】:

如果这不能解决您的问题,我深表歉意(我还不能发表评论)。根据提供的信息,我看到在执行此函数之前您没有收到任何错误:

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)

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 2019-08-27
    • 2020-05-27
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多