TypeError: string indices must be integers 在使用 Python 解析 Json 时出现错误

新手上路,请多包涵

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

所以我试图从我使用以下代码获得的 API 解析 json:

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

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

data = r.json()

我可以很容易地从 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'
         },

它是 [items, links, self] 数据

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

 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

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

 for each in data['items'][0]['links']:
        print(each['self'])

我收到此错误:

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

我只是不明白为什么它向我抛出这个错误,互联网上的所有其他响应都指向一个事实,即我正在尝试解析一个字符串而不是一个实际的 json 对象,但是每当我运行命令时:

 type(data)

它返回:

 <class 'dict'>

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

我确定我犯了一个非常愚蠢的错误,如果是这样我道歉但我无法弄清楚我做错了什么,有人可以帮忙吗?

ps 很抱歉发了这么长的帖子。

编辑:

非常感谢您的所有回复,现在看来一切都明白了。我们都曾经是学习者! :)

原文由 Ruthus99 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

'links' 键指向字典值,因此对其进行迭代会为您提供字典的键,在本例中为 'self' 。你应该做:

 for k, v in data['items'][0]['links'].items():
    if k == 'self':
        print(v)

或者您可以简单地访问键 'self' 的值而无需迭代:

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

原文由 Moses Koledoye 发布,翻译遵循 CC BY-SA 3.0 许可协议

data['items'][0]['links']: 是一个字典: { 'self':'DELETED' }

遍历字典会产生它的键:在这种情况下,只有一个,’self’。 `‘self’[‘self’] 解释了你的错误

What you want is possibly just data['items'][0]['links']['self'] , or iterate over one of the dict methods .keys() , .values() or .items()

 for key,value in data['items'][0]['links'].items()
   print(key,":",value)

原文由 nigel222 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题