我是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列表中每位员工的电话号码。
我很确定我接近错误,但我需要一些反馈和指导。
答案 0 :(得分:6)
您的JSON是list
个dict
个对象。通过执行j[1]
,您将访问索引1
列表中的项目。为了获取所有记录,您需要将列表的所有元素迭代为:
for item in j:
print item['name']
其中j
是j = 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
如果您需要根据需要查找单个内容(因此您并不总是需要name
或phone_number
),那么定期dict
查找会有意义,这只是通过将工作推送到内置函数(在CPython参考解释器上,在C中实现,因此它们比手动代码运行得快一点),优化了总是检索同一组项目的情况。使用基于map
的生成器并非绝对必要,但是当您只是想要迭代结果时,它可以避免产生(可能很大)临时list
。
它基本上只是一个更快的版本:
for emp in j:
name, phone_number = emp['name'], emp['phone_number']
print name, phone_number