You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从嵌套字典提取数据时遇TypeError: string indices must be integers错误

解决TypeError: string indices must be integers的问题

兄弟,你踩的这个坑太常见了——account_info['payload']根本不是嵌套字典,而是一个字符串!你看它的取值是被双引号包裹的u"{'account_title': u’sam b’, ...}",本质是字符串类型,所以当你尝试用['email_address']这种字典键去索引字符串时,Python自然会报错说“字符串索引必须是整数”。

下面给你两种靠谱的解决方法:

方法1:用ast.literal_eval(推荐,安全)

ast.literal_eval是Python标准库ast里的方法,它能安全地把字符串形式的Python字面量(比如字典、列表)转换成对应的对象,比直接用eval安全多了(eval会执行字符串里的任意代码,风险很高)。

代码示例:

import ast

# 你的原始字典
account_info = {u'id': u'000123', u'payload': u"{'account_title': u’sam b’, 'phone_num': ‘1234567890’, 'security_pin': u'000000', 'remote_word': u’secret123’, 'email_address': ‘email@gmail.com’, 'password': u’password123’}"}

# 将payload字符串转换为真正的字典
payload_dict = ast.literal_eval(account_info['payload'])

# 现在可以正常访问email_address了
print(payload_dict['email_address'])  # 输出: email@gmail.com

方法2:用json.loads(需处理引号格式)

如果你的payload字符串能转换成标准JSON格式,也可以用json.loads,但要注意JSON要求键和字符串必须用双引号,而且你的字符串里还有中文单引号(‘和’),得先替换成英文引号:

代码示例:

import json

account_info = {u'id': u'000123', u'payload': u"{'account_title': u’sam b’, 'phone_num': ‘1234567890’, 'security_pin': u'000000', 'remote_word': u’secret123’, 'email_address': ‘email@gmail.com’, 'password': u’password123’}"}

# 先清理引号:把中文单引号换成英文单引号,再把所有单引号换成双引号
clean_payload = account_info['payload'].replace("‘", "'").replace("’", "'").replace("'", '"')

# 转换为字典
payload_dict = json.loads(clean_payload)

print(payload_dict['email_address'])  # 输出: email@gmail.com

额外提醒

  • 优先用ast.literal_eval,尤其是当payload内容来自不可信来源时,避免安全风险;
  • 注意字符串里的非标准引号(比如中文引号),转换前要先处理成英文引号,否则会触发解析错误。

内容的提问来源于stack exchange,提问作者srb7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:30:48