json Python错误:TypeError:字符串索引必须是整数

wwodge7n  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(102)

我正在尝试从所有类别下的Disconnect.json文件中提取所有唯一域的列表。这是我使用的json文件的链接。https://github.com/disconnectme/disconnect-tracking-protection/blob/master/services.json
下面是我的Python代码:

import json

def get_disconnect_domains(disconnect_json_file):
    disconnect_domains = set()
    with open(disconnect_json_file, 'r') as f:
        disconnect_json = json.load(f)
        for category in disconnect_json['categories']:
            for tracker in category['trackers']:
                disconnect_domains.add(tracker['domain'])

    return disconnect_domains

disconnect_domains = get_disconnect_domains('disconnect.json')

(我将文件保存为disconnect.json)但我一直遇到这个错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-1e2723fa469d> in <cell line: 14>()
     12 
     13 # Get the list of all unique domains from the disconnect.json file
---> 14 disconnect_domains = get_disconnect_domains('services.json')
     15 
     16 # Print the list of all unique domains

<ipython-input-24-1e2723fa469d> in get_disconnect_domains(disconnect_json_file)
      6         disconnect_json = json.load(f)
      7         for category in disconnect_json['categories']:
----> 8             for tracker in category['trackers']:
      9                 disconnect_domains.add(tracker['domain'])
     10 

TypeError: string indices must be integers

我通常不使用Python,所以我不确定到底是哪里出了问题。有人能帮帮忙吗?

mdfafbf1

mdfafbf11#

这些域在JSON结构中嵌套得相当深。你可以这样访问它们:

import json

with open('services.json', encoding='utf-8') as raw:
    output = set()
    data = json.load(raw)
    for v in data['categories'].values():
        for d in v:
            for _v in d.values():
                for __v in _v.values():
                    if isinstance(__v, list):
                        output.update(__v)
    print(output)
t3psigkw

t3psigkw2#

您遇到的错误消息“TypeError: string indices must be integers”表明您正在尝试使用字符串索引访问字符串,就好像它是字典一样,这在Python中是不允许的。
这个问题很可能与您试图解析的JSON文件的结构有关。要访问JSON文件中的元素,在处理对象时应该使用字典式索引(带键),在处理数组时应该使用列表式索引(带整数)。
在您的示例中,发生错误是因为您将字符串视为字典。要解决此问题,您需要根据JSON中的对象类型正确浏览JSON结构。
以下是正确导航JSON结构的代码的更新版本:

import json

def get_disconnect_domains(disconnect_json_file):
    disconnect_domains = set()
    with open(disconnect_json_file, 'r') as f:
        disconnect_json = json.load(f)
        for category in disconnect_json:
            if 'trackers' in category:
                for tracker in category['trackers']:
                    if 'domain' in tracker:
                        disconnect_domains.add(tracker['domain'])

    return disconnect_domains

disconnect_domains = get_disconnect_domains('services.json')

# Print the list of all unique domains
for domain in disconnect_domains:
    print(domain)

这段代码假设JSON文件包含一个带有“trackers”键的对象数组,每个tracker对象都有一个“domain”键。它相应地导航JSON结构并提取唯一域。
确保“services.json”文件的JSON结构与此代码中的假设相匹配。如果JSON的结构不同,则需要相应地调整代码。

相关问题