Python操作SQLite3:将JSON格式字段解析为列表数组
Python操作SQLite3:将JSON格式字段解析为列表数组
嘿,我来帮你搞定这个问题!你现在碰到的情况,是因为存储JSON字段的时候格式没处理对,加上查询出来的字符串带了多余的转义引号,所以没法直接转成Python列表。咱们分步骤来解决:
一、先纠正插入数据的错误姿势
首先得说,你之前的插入代码有两个小问题:
- 用了
json.dump(),这个函数是用来把JSON数据写入文件对象的,不是生成JSON字符串的,应该用json.dumps()来把Python列表转成标准的JSON字符串; - 你手动把列表写成了字符串
'[1,2,3,4]'再去转,这完全没必要,直接转Python列表就行。
正确的插入代码应该是这样的:
import json import sqlite3 # 连接数据库 conn = sqlite3.connect('你的数据库名.db') cursor = conn.cursor() # 直接把Python列表转成JSON字符串 values = ("idTest", 1, json.dumps([1, 2, 3, 4])) cursor.execute('INSERT INTO link VALUES(?, ?, ?)', values) conn.commit()
用这种方式插入后,后续查询出来的结果就是标准的JSON字符串,直接用json.loads()就能转成列表,不会有多余的转义了。
二、解析已存在的错误格式数据
如果是已经按错误方式插入的数据(就是你现在查询出来的"\"[1, 2, 3, 4]\""这种格式),也不用手动切割字符串,咱们用更稳妥的方法:
import json import sqlite3 conn = sqlite3.connect('你的数据库名.db') cursor = conn.cursor() # 执行查询 cursor.execute('SELECT note_id FROM link WHERE id = "idTest"') result = cursor.fetchone()[0] # 先去掉字符串前后的多余双引号,再用json.loads转成列表 cleaned_str = result.strip('"') note_list = json.loads(cleaned_str) print(note_list) # 输出: [1, 2, 3, 4] print(type(note_list)) # 输出: <class 'list'>
这种方法比手动切割字符串靠谱多了,哪怕以后JSON格式有小变化(比如元素数量变了),也能正常解析。
三、进阶:用SQLite的JSON函数直接解析(需要高版本支持)
如果你的SQLite版本是3.38.0及以上(可以用sqlite3.sqlite_version查看版本),还能直接在SQL查询里就把JSON解析好,Python端直接用就行:
cursor.execute('SELECT json_extract(note_id, "$") FROM link WHERE id = "idTest"') result = cursor.fetchone()[0] note_list = json.loads(result)
这个方法的好处是把部分解析工作交给了数据库,Python端的代码更简洁,但要注意版本要求。
备注:内容来源于stack exchange,提问作者Pedro Henrique Moreira




