将 JSON 字符串转换为 Python 字典

Ali*_*aei 4 python sqlite json

我在 Python 方面没有太多经验,并且在将 sql 查询数据转换为 Python 字典时遇到了问题,从技术上讲,该数据是包含 JSON 字符串的列表。我正在查询 sqlite3 数据库,它返回如下数据:

def get_answer(self, id):
    self.__cur.execute('select answer from some_table where id= %s;' % id)
    res_data = self.__cur.fetchall()
    return res_data
Run Code Online (Sandbox Code Playgroud)

数据是单个 JSON 格式元素,其简化版本如下所示:

[
 {"ind": [ {"v": 101}, {"v": 102}, {"v": 65 }]},
 {"ind": [ {"v": 33}, {"v": 102}, {"v": 65}]}
]
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将 res_data 转换为 JSON 时,代码如下:

temp_json = simplejson.dumps(get_answer(trace_id))
Run Code Online (Sandbox Code Playgroud)

它返回一个字符串,当我获取 len(temp_json) 时,它返回 res_data 中的字符数,而不是 res_data 中的对象数。但是,如果我对 get_answer(trace_id) 返回的内容使用 Visual Studio 的 JSON 可视化工具,它会正确显示每个对象 res_data。

我还尝试使用如下代码将 res_data 转换为字典:

dict_data = ast.literal_eval(Json_data)
Run Code Online (Sandbox Code Playgroud)

或者

dict_data = ast.literal_eval(Json_data[0])
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,它都会抛出“格式错误的字符串”异常。我尝试将其写入文件并将其作为 JSON 读回,但没有成功。

在此之前,我手动粘贴了 res_data 的副本并使用:

with open(file_name) as json_file:
    Json_data = simplejson.load(json_file)
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力。我一直在尝试 SO 和其他地方所述的不同方法,但尽管问题看起来非常简单,但我仍然没有找到解决方案,因此非常感谢您的帮助。

Ali*_*aei 6

好的,我终于找到了解决方案:

states = json.loads(temp_json[0][0])
Run Code Online (Sandbox Code Playgroud)

一个令人困惑的问题是states = json.loads(temp_json[0])抛出“预期字符串或缓冲区”异常,而 temp_json 是一个仅包含一个元素的列表,因此我认为我不会从 temp_json[0][0] 中得到任何内容。

我希望它也能帮助其他人!


Fal*_*ter 5

我认为您混淆了数据格式。你应该从数据库包装器中得到的似乎是一个字典列表(它也不是 SQL - 你的问题标题具有误导性)。但我实际上认为 sqlite3 会给你一个元组列表。

JSON 是一种文本格式,或更准确地说,是将对象序列化为字符串。这就是为什么 json.dumps(= 转储到字符串)会产生一个字符串,而 json.loads(= 加载字符串)会产生一个 python 对象、一个字典或一个字典列表。

json.dumps 并不意味着“将 JSON 转储为字符串”。它是 json 模块的 .dumps 方法,它接受一个 Python 对象(dict、list)并将其序列化为 JSON。

如果我明白你到底想要实现什么,但你使用 json.dumps() 获得 JSON,我将扩展答案,JSON 是字符串格式。相比之下, simplejson.load() 为您提供一个 Python 列表或字典。

您是否尝试过 json.loads() 以防万一从数据库返回的实际上是一个字符串(您可以轻松测试)。