【问题标题】:How do I pull a recurring key from a JSON?如何从 JSON 中提取重复密钥?
【发布时间】:2017-01-29 01:26:12
【问题描述】:

我是 python 新手(和一般的编码),我已经做到了这一点,但我遇到了麻烦。我正在查询一个 Web 服务,该服务返回一个包含每个员工信息的 json 文件。我只想为每个员工提取几个属性,但我遇到了一些麻烦。

到目前为止我有这个脚本:

import json
import urllib2

req = urllib2.Request('http://server.company.com/api')
response = urllib2.urlopen(req)
the_page = response.read()

j = json.loads(the_page)

print j[1]['name']

它返回的 JSON 如下所示...

{
    "name": bill jones,
    "address": "123 something st",
    "city": "somewhere",
    "state": "somestate",
    "zip": "12345",
    "phone_number": "800-555-1234",
},
{
    "name": jane doe,
    "address": "456 another ave",
    "city": "metropolis",
    "state": "ny",
    "zip": "10001",
    "phone_number": "555-555-5554",
},

您可以看到,使用脚本,我可以返回索引 1 中的员工姓名。但我想要更多类似的内容:print j[**0 through len(j)**]['name'],以便打印出姓名(最好是电话号码也)json列表中的每个员工。

我很确定我做错了什么,但我需要一些反馈和指导。

【问题讨论】:

  • 您是否尝试过使用 for 循环来检查您的数据并获取您的员工信息?提示,当您执行j[0] 时,正如您所指出的,您正在指定list 的索引。因此,如果您简单地遍历该 j,则每次迭代都将成为您的字典,并且您可以通过每次迭代访问您的数据。
  • 您的示例 JSON 错误。将其包裹在 [ ... ]

标签: python json python-2.7 dictionary urllib2


【解决方案1】:

您的 JSON 是 listdict 对象。通过执行j[1],您将访问列表中索引1 处的项目。为了获取所有记录,您需要将列表的所有元素迭代为:

for item in j:
    print item['name']

jj = json.loads(the_page) 的结果,正如您在回答中提到的那样

【讨论】:

    【解决方案2】:

    质量转换比重复使用dict 查找使用operator.itemgetter 更好:

    from future_builtins import map  # Only on Py2, to get lazy, generator based map
    from operator import itemgetter
    
    for name, phone_number in map(itemgetter('name', 'phone_number'), j):
        print name, phone_number
    

    如果您需要根据需要查找个别事物(因此您并不总是需要 namephone_number),那么常规的 dict 查找将是有意义的,这只是优化了您总是通过将工作推送到内置函数来检索相同的项目集(在 CPython 参考解释器中,这些函数是用 C 实现的,因此它们的运行速度比手动代码快一点)。使用基于 map 的生成器并不是绝对必要的,但它可以避免在您无论如何都要迭代结果时生成(可能很大)临时的 lists。

    它基本上只是一个更快的版本:

    for emp in j:
        name, phone_number = emp['name'], emp['phone_number']
        print name, phone_number
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2020-06-22
      • 2018-12-30
      • 2019-03-22
      • 2021-02-05
      • 1970-01-01
      相关资源
      最近更新 更多