Python解析RethinkDB返回数据:无效JSON疑问与值提取方法
问题描述
我尝试从RethinkDB数据库中获取数据,使用r.db("Databasename").table("tablename").sample(1).run()语句得到的返回结果为[{'id': 'ValueInRowOfid\n'}],希望提取出其中的ValueInRowOfid值。但使用Python的json模块处理时,始终遇到TypeError: list indices must be integers or slices, not str错误,有人告知是因为数据库返回了无效JSON格式。我想了解:
- 该返回格式为何属于无效JSON?
- 如何正确解析并提取目标值到变量中?
导入模块并连接RethinkDB
import json from rethinkdb import RethinkDB r = RethinkDB() r.connect( "localhost", 28015).repl()
获取数据及尝试解析的代码
getvalue = r.db("Databasename").table("tablename").sample(1).run() # 获取单条数据 print(getvalue) # 输出为[{'id': 'ValueInRowOfid\n'}] dumper = json.dumps(getvalue) # 将结果转为JSON字符串 parsevalue = json.loads(dumper) # 解析JSON print(parsevalue["id"]) # 报错:list indices must be integers or slices, not str print(parsevalue{'id'}) # 同样报错
我已查阅JSON文档、教程并搜索同类问题,但未找到解决方法。
解答
1. 为何返回格式属于无效JSON?
你看到的[{'id': 'ValueInRowOfid\n'}]是Python内置数据结构(列表+字典)的打印格式,并非标准JSON:
- 标准JSON要求所有字符串(包括键名)必须使用双引号,但这里的
id用的是单引号 - 实际上
getvalue本身就是Python的列表对象,不是JSON字符串,错误的根源是你对返回值的类型判断有误,而非数据是无效JSON。
2. 正确提取目标值的方法
sample(1)方法返回的是包含0或1条记录的Python列表,直接操作这个列表和内部的字典即可,无需转JSON:
修正代码
getvalue = r.db("Databasename").table("tablename").sample(1).run() # 先检查列表是否有数据,避免索引越界 if getvalue: # 取列表第一个元素(索引0),再获取'id'对应的值,strip()去除末尾换行符 target_id = getvalue[0]['id'].strip() print(target_id) # 输出:ValueInRowOfid else: print("未获取到数据")
核心要点
- 不管
sample(1)是否返回数据,结果都是列表,必须先通过索引[0]取出内部的字典,才能访问'id'键 .strip()可以移除字符串末尾的\n,如果不需要保留纯净的ID值可以省略- 增加非空判断能避免无数据时出现
IndexError
内容的提问来源于stack exchange,提问作者Dec1lent
相关产品推荐
相关产品推荐

