我没有太多的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和其他地方陈述的不同方式,但虽然问题看起来很直接,但我仍然没有找到解决方案,所以我们非常感谢您的帮助。
答案 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]得到任何东西。
我希望它也有助于其他人!