You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python操作SQLite3:将JSON格式字段解析为列表数组

Python操作SQLite3:将JSON格式字段解析为列表数组

嘿,我来帮你搞定这个问题!你现在碰到的情况,是因为存储JSON字段的时候格式没处理对,加上查询出来的字符串带了多余的转义引号,所以没法直接转成Python列表。咱们分步骤来解决:

一、先纠正插入数据的错误姿势

首先得说,你之前的插入代码有两个小问题:

  1. 用了json.dump(),这个函数是用来把JSON数据写入文件对象的,不是生成JSON字符串的,应该用json.dumps()来把Python列表转成标准的JSON字符串;
  2. 你手动把列表写成了字符串'[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

火山引擎 最新活动