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

处理JSON时报TypeError: list indices must be integers or slices, not str如何修复

报错原因
  • 你生成的data是列表类型:通过列表推导式逐行加载JSON后,每个完整的JSON对象是data的子元素,直接用字符串键k访问列表data[k]不符合Python语法,触发类型错误
  • 逻辑层级混淆:你遍历的是第一个JSON对象data[0]的键值对,后续取值、修改操作的对象应该是data[0][k],不是顶层的data
适配原需求的修复代码

如果你确定JSON中带$的字段都只有一层嵌套、且每行对应一个JSON对象,可以直接修改原有逻辑:

import json
with open('C:\\Windows\\System32\\files\\news.json', 'r', encoding="utf8") as handle:
    data = [json.loads(line) for line in handle]

# 遍历列表内的每一个JSON对象
for obj in data:
    for k, v in obj.items():
        if isinstance(v, dict):
            # 遍历当前字典的所有键,判断是否带$
            for sub_k in list(v.keys()):
                if sub_k.startswith('$'):
                    # 直接把值上提一层覆盖原字段
                    obj[k] = v[sub_k]
                    break

print(data)
通用递归版本(支持任意层级带$的字段清理)

如果后续可能出现多层嵌套的带$字段,建议用递归逻辑适配所有场景:

import json

def clean_dollar_fields(obj):
    if isinstance(obj, dict):
        new_obj = {}
        for k, v in obj.items():
            if k.startswith('$'):
                # 遇到$开头的键直接返回清理后的值,不上提键名
                return clean_dollar_fields(v)
            new_obj[k] = clean_dollar_fields(v)
        return new_obj
    elif isinstance(obj, list):
        return [clean_dollar_fields(item) for item in obj]
    else:
        return obj

with open('C:\\Windows\\System32\\files\\news.json', 'r', encoding="utf8") as handle:
    data = [clean_dollar_fields(json.loads(line)) for line in handle]

print(data)

内容的提问来源于stack exchange,提问作者n.mathfreak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 05:45:00