将JSON字符串转换为Python字典

4

我不太熟悉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

数据是一个单独的JSON格式元素,其简化版本如下所示:
[
 {"ind": [ {"v": 101}, {"v": 102}, {"v": 65 }]},
 {"ind": [ {"v": 33}, {"v": 102}, {"v": 65}]}
]

但是当我尝试将res_data转换为JSON格式时,使用的代码类似于这样:
temp_json = simplejson.dumps(get_answer(trace_id))

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

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

dict_data = ast.literal_eval(Json_data)

或者
dict_data = ast.literal_eval(Json_data[0])

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

在此之前,我手动复制粘贴了res_data并使用了以下方法:

with open(file_name) as json_file:
    Json_data = simplejson.load(json_file)

它很顺利地工作了。我一直在尝试不同的方法,包括Stack Overflow和其他地方提到的方法,但是虽然问题看起来很简单,但我仍然没有找到解决方案,因此非常感谢您的帮助。

2个回答

6

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

states = json.loads(temp_json[0][0])

有一个令人困惑的问题是,states = json.loads(temp_json[0]) 抛出了 "Expected string or buffer" 异常,并且 temp_json 是一个只包含一个元素的列表,所以我认为我不会从 temp_json[0][0] 中得到任何东西。

我希望这对其他人也有所帮助!


1
什么是这两种方式? - lucid_dreamer

5
我认为你混淆了数据格式。你从数据库封装器中得到的似乎是一个字典列表(这不是SQL - 你的问题标题有误导性)。但我实际上认为sqlite3会给你一个元组列表。
JSON是一种文本格式,更准确地说是将对象序列化为字符串。这就是为什么json.dumps(= dump to string)的结果是一个字符串,而json.loads(= load string)会生成一个Python对象,即一个字典或字典列表。
json.dumps并不意味着“将JSON转储为字符串”。它实际上是json模块的.dumps方法,它接受一个Python对象(字典、列表)并将其序列化为JSON。
如果我理解你想达到的目的,我将扩展回答,但是使用json.dumps()可以获得JSON,JSON是一个字符串格式。相比之下,simplejson.load()会给你一个Python列表或字典。
你是否尝试过json.loads(),以防返回的东西实际上是一个字符串(你可以很容易地测试)?

simplejson中的load()会抛出异常“list has no attribute read”。json.loads()则会抛出“expected string or buffer”的异常。当我使用type(res_data)时,它显示为一个列表。但是该列表的长度为1,而该单个元素的长度为该列表中字符数的数量。 - Ali Kahaei
我想将res_data转换为字典。 - Ali Kahaei
查询多列时,返回一个元组列表。在这种情况下,我只接收一个单元格,该单元格位于一行中的一个列中,其中包含一个字符串元素的列表。因此,只有一个res_data[0],它本身是一个字符串。 - Ali Kahaei
如果需要,请多问一些问题,因为我可能没有准确地描述问题。基本上,我想要上述所述的res_data以Python格式,以便我可以浏览它,找到我想要的元素并处理数据。我仍然没有尝试ORM,但数据已经被存储,我必须处理它,所以我无法对存储的数据做任何事情。 - Ali Kahaei
数据通过以下语句保存在 Django web 应用程序中的模型中:answer = models.TextField() - Ali Kahaei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接