如何从JSON中提取定期密钥?

时间:2016-09-21 00:19:22

标签: python json python-2.7 dictionary urllib2

我是python的新手(以及一般的编码),我已经走到了这一步,但我遇到了麻烦。我查询了一个返回json文件的Web服务,该文件包含每个员工的信息。我想为每位员工提供一些属性,但我遇到了一些麻烦。

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

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列表中每位员工的电话号码。

我很确定我接近错误,但我需要一些反馈和指导。

2 个答案:

答案 0 :(得分:6)

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

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

其中jj = json.loads(the_page)的结果,如答案中所述

答案 1 :(得分:3)

使用operator.itemgetter进行大量转化比使用pycorenlp重复dict查找更好:

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的生成器并非绝对必要,但是当您只是想要迭代结果时,它可以避免产生(可能很大)临时list

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

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