【问题标题】:How to loop through JSON in Python如何在 Python 中遍历 JSON
【发布时间】:2012-06-07 00:32:06
【问题描述】:

我不知道如何通过比 1 级更深的 JSON 对象进行循环。对象是:

{
  "data":[
    {
      "id":"251228454889939/insights/page_fan_adds_unique/day",
      "name":"page_fan_adds_unique",
      "period":"day",
      "values":[
        {
          "value":9,
          "end_time":"2012-05-29T07:00:00+0000"
        },
        {
          "value":5,
          "end_time":"2012-05-30T07:00:00+0000"
        }
      ],
      "title":"Daily New Likes",
      "description":"Daily The number of new people who have liked your Page (Unique Users)"
    },
    {
      "id":"251228454889939/insights/page_fan_adds/day",
      "name":"page_fan_adds",
      "period":"day",
      "values":[
        {
          "value":9,
          "end_time":"2012-05-29T07:00:00+0000"
        },
        {
          "value":5,
          "end_time":"2012-05-30T07:00:00+0000"
        }
      ],
      "title":"Daily New Likes",
      "description":"Daily The number of new people who have liked your Page (Total Count)"
    }
  ]
}

代码:

def parseJsonData(data):
    output_json = json.loads(data)
    for i in output_json:
        print i
        for k in output_json[i]:
            print k

为什么我不能访问像:output_json[data][id] 这样的对象? 如果我尝试这个,我会得到一个错误:

字符串索引必须是整数

【问题讨论】:

    标签: python json loops


    【解决方案1】:

    由于您的“数据”键实际上是一个对象列表,因此您不能直接通过它们的“id”字段访问这些项目。您需要通过列表索引访问每个项目,例如:
    output_json["data"][0]["id"]

    现在,如果您想做的是能够通过“id”字段作为键来索引“data”的成员,您可以重新格式化您的数据:

    # make "data" a dict {id: item, }, instead of list [item1, item2, ...]
    output_json['data'] = dict((item['id'], item) for item in json_data['data'])
    
    print output_json['data']
    # {'251228454889939/insights/page_fan_adds_unique/day': ...
    
    print output_json['data']['251228454889939/insights/page_fan_adds_unique/day']
    # {'description': 'Daily The number of new p ...
    
    # ways to loop over "data"
    for id_, item in output_json['data'].iteritems():
        print id_, item
    
    for item in output_json['data'].itervalues():
        print item
    

    否则你只需要循环“数据”,因为索引和对象之间没有真正的关联:

    for item in output_json["data"]:
        print item['id']
    
    # 251228454889939/insights/page_fan_adds_unique/day
    # 251228454889939/insights/page_fan_adds/day
    

    【讨论】:

      【解决方案2】:

      您粘贴的不是有效的 JSON。 “数据”后面有一个不匹配的[。

      基于此,我猜可能数据不是您认为的那样。如果 output_json[data] 的值是一个列表,那么您将无法访问output_json[data][id]。相反,您必须执行output_json[data][0][id] 之类的操作,其中 [0] 访问列表中的第一项。

      【讨论】:

      • 我确定它对 OP 来说是有效的 json,但 OP 只是发布了整个事情的一部分
      • 根据缩进和括号,看起来不像。顶部有一个开括号,显然被最底部的括号封闭,但在它们之间,出现了不匹配的 [。它可能是一个切片,但如果是这样,它就是一个不连续的或其他畸形的切片。
      • 您所要做的就是在最后一个} 之前添加一个结束]。缩进并不重要。
      • 我意识到标识对于 JSON 并不重要。我只是说,在面向人类读者的普通 JSON 输出中,缩进通常是一致的,所以它不在这里的事实表明它不是真实数据的简单切片。在任何情况下,如果 OP 没有发布有效数据,就很难回答这个问题,正因为如此:我们必须通过猜测粘贴数据的哪些部分是和现在来弄清楚真实数据的问题是什么不是真实数据的一部分。
      • 我认为你错过了这个问题。除了他缺少一个 ] 之外,这些数据都是有效的,缩进问题很可能是 OP 是 StackOverflow 的新手,并且不太了解代码格式。很容易看出代码应该是什么。有点模棱两可的是他真的想如何访问它。
      猜你喜欢
      • 1970-01-01
      • 2020-04-09
      • 2018-06-19
      • 2017-02-23
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多