Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeError:使用Python解析Json时,字符串索引必须是整数错误_Python_Json_Python 3.x - Fatal编程技术网

TypeError:使用Python解析Json时,字符串索引必须是整数错误

TypeError:使用Python解析Json时,字符串索引必须是整数错误,python,json,python-3.x,Python,Json,Python 3.x,在你判断和思考“这个问题我已经看了一千遍”之前,请继续读下去,给我一个机会,我已经在互联网上搜寻答案,但似乎找不到任何帮助 因此,我尝试从一个API解析json,我使用以下代码获得该API: url = 'https://api.companieshouse.gov.uk/company/' + companyno + '/charges' r = requests.get(url, auth=('API KEY', '')) data = r.json() for each in dat

在你判断和思考“这个问题我已经看了一千遍”之前,请继续读下去,给我一个机会,我已经在互联网上搜寻答案,但似乎找不到任何帮助

因此,我尝试从一个API解析json,我使用以下代码获得该API:

url = 'https://api.companieshouse.gov.uk/company/' + companyno + '/charges'

r = requests.get(url, auth=('API KEY', ''))

data = r.json()
for each in data['items'][0]['links']:
        print(each['self'])
我可以很容易地从json获取特定值,例如使用以下代码:

for each in data['items']:
    print(each['created_on'])
返回:

2016-11-08
2016-11-08
2016-11-08
2015-03-27
2015-03-27
2015-03-27
2015-03-27
2015-03-27
2007-10-10
2007-09-28
2007-09-19
这正是我想要的,它适用于其他键

然而,有一点json我似乎无法访问,我稍微编辑了json,以避免释放敏感数据(无论如何,公众都可以获得这些数据,但只是为了谨慎起见),但基本上没有改变:

{  
   'items':[  
      {  
         'created_on':'2016-11-08',
         'etag':'DELETED',
         'classification':{  
            'type':'charge-description',
            'description':'A registered charge'
         },
         'particulars':{  
            'contains_negative_pledge':True,
            'description':'DELETED',
            'type':'brief-description'
         },
         'transactions':[  
            {  
               'links':{  
                  'filing':'DELETED'
               },
               'filing_type':'create-charge-with-deed',
               'delivered_on':'2016-11-21'
            }
         ],
         'links':{  
            'self':'DELETED'
         },
         'charge_code':'DELETED',
         'delivered_on':'2016-11-21',
         'status':'outstanding',
         'persons_entitled':[  
            {  
               'name':'DELETED'
            },
            {  
               'name':'DELETED'
            }
         ],
         'charge_number':59
      },
      {  
         'transactions':[  
            {  
               'delivered_on':'2016-11-10',
               'links':{  
                  'filing':'DELETED'
               },
               'filing_type':'create-charge-with-deed'
            }
         ],
         'particulars':{  
            'contains_negative_pledge':True,
            'contains_fixed_charge':True,
            'floating_charge_covers_all':True,
            'contains_floating_charge':True
         },
         'persons_entitled':[  
            {  
               'name':'DELETED'
            }
         ],
         'charge_number':58,
         'status':'outstanding',
         'charge_code':'DELETED',
         'links':{  
            'self':'DELETED'
         },
它是[项目、链接、自我]数据

如果我使用以下代码尝试访问它:

for each in data['items']['links']:
    print(each['self'])  
我得到以下错误:

  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not str
我得到这个错误:

  File "<stdin>", line 2, in <module>
TypeError: string indices must be integers
它返回:

<class 'dict'>

所以我知道这是一个字典,它应该能够遍历键

我肯定我犯了一个非常愚蠢的错误,如果是这样,我向你道歉,但我就是不知道我做错了什么,有人能帮忙吗

p、 对不起,邮件太长了

编辑:


非常感谢您的回复,现在一切似乎都有意义了。我们在某一点上都是学习者!:)

'links'
指向一个字典值,因此迭代它会得到字典的键,在本例中,该键是
'self'
。你应该做:

for k, v in data['items'][0]['links'].items():
    if k == 'self':
        print(v)
或者,您只需访问键
'self'
处的值,无需迭代:

print(data['items'][0]['links']['self'])

如果该响应中有多个项目,请执行以下操作:

for item in data['items']:
    print(item['links']['self'])
否则
打印(数据['items'][0]['links']['self'])
就足够了

或者,您可以使用JSONPath(类似于XPath):


数据['items'][0]['links']:
是一个命令:
{'self':'DELETED'}

在dict上迭代会产生它的键:在本例中,只有一个“self”self'['self']解释了您的错误

您需要的可能只是
数据['items'][0]['links']['self']
,或者迭代其中一个dict方法
.keys()
.values()
.items()


你能发布一个有效的json吗?您发布的内容似乎不完整,因此很难对其进行测试。或者
打印(数据['items'][0]['links'].get('self'))
,以防此密钥不存在。非常感谢您,感觉就像刚刚点击了解析json:)一样。唉。
for item in data['items']:
    print(item['links']['self'])
import jsonpath_rw as jp

for match in jp.parse('items[*].links.self').find(data):
    print(match.value)
for key,value in data['items'][0]['links'].items()
   print(key,":",value)