解析JSON文件时遭遇TypeError: string indices must be integers, not str错误求助
解决TypeError: string indices must be integers, not str(JSON解析时host字段为字符串的问题)
我之前也踩过这个一模一样的坑!这个错误的核心逻辑很简单:你代码里默认把host字段当成了字典/对象来访问(比如写了host["ip"]或者host["address"]这种代码),但实际你的JSON文件里,host是一个普通的字符串类型(比如"host": "192.168.0.1"),字符串只能用整数索引(比如host[0]取第一个字符),所以才会抛出这个错误。
下面给你分场景的解决思路:
第一步:先确认JSON里的host字段真实结构
先在代码里加一行打印,看看host到底是什么:
import json with open("your_json_file.json", "r") as f: data = json.load(f) print("host字段的类型:", type(data["host"])) print("host字段的内容:", data["host"])
运行后如果输出是<class 'str'>,那确实是字符串,接下来看两种场景:
场景1:JSON数据本身不符合预期
如果这个JSON是你自己维护的,或者是合作方提供的错误数据:
- 直接修改JSON文件,把
host改成你需要的字典结构,比如:
错误写法:
改成正确的结构(根据你的需求调整字段):{ "host": "example.com" }{ "host": { "address": "example.com", "port": 443 } } - 如果是第三方接口返回的错误数据,优先联系接口方修复;如果暂时没法改,就做兼容处理(看场景2)。
场景2:代码解析逻辑出错,或者需要兼容字符串格式的host
如果有时候host是字符串,有时候是字典,或者你误把嵌套层级搞错了:
- 先检查你的索引路径:比如你是不是应该访问
data["server"]["host"],结果写成了data["host"],而data["host"]刚好是个字符串? - 如果需要兼容两种格式,写个判断逻辑:
host_data = data.get("host") if isinstance(host_data, str): # 把字符串当成主机地址,用默认端口 host_address = host_data host_port = 80 elif isinstance(host_data, dict): # 从字典里取需要的字段 host_address = host_data.get("address") host_port = host_data.get("port", 80) # 没port字段就用默认80 else: raise ValueError("host字段的类型既不是字符串也不是字典,无法解析")
特殊情况:host是字符串格式的JSON
如果你的host字段是一个被引号包裹的JSON字符串(比如"host": "{'ip': '1.1.1.1', 'port': 80}"),那你需要把这个字符串再解析一次:
import json host_str = data["host"] # 先把单引号转双引号(JSON要求双引号),再解析成字典 host_dict = json.loads(host_str.replace("'", "\"")) # 之后就可以正常用host_dict["ip"]访问了
内容的提问来源于stack exchange,提问作者user9300944
相关产品推荐
相关产品推荐

