将JSON字符串转换为Python字典

时间:2015-12-11 17:38:12

标签: python json sqlite

我没有太多的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中的字符数,而不是res_data中的对象数。但是,如果我在get_answer(trace_id)返回的内容上使用Visual Studio的JSON可视化工具,则会正确显示每个对象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)

它就像一个魅力。我一直在尝试在SO和其他地方陈述的不同方式,但虽然问题看起来很直接,但我仍然没有找到解决方案,所以我们非常感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

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

JSON是一种文本格式,或者更准确地说是将对象序列化为字符串。这就是json.dumps(= dump to string)导致字符串和json.loads(= load string)导致python对象,字典或字典列表的原因。

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

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

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

答案 1 :(得分:2)

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

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

一个令人困惑的问题是states = json.loads(temp_json[0])正在抛出"预期的字符串或缓冲区"异常和temp_json是一个只包含一个元素的列表,所以我不认为我会从temp_json [0] [0]得到任何东西。

我希望它也有助于其他人!