我是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列表中每个员工的名字(最好也是电话号码)。
我很确定我做错了什么,但我需要一些反馈和方向。
您的JSON是dict
对象的list
。通过执行j[1]
,您正在访问索引为1
的列表中的项。为了获得所有记录,您需要迭代列表中的所有元素:
for item in j:
print item['name']
其中j
是j = json.loads(the_page)
的结果,正如你的答案中提到的
对于大量转换来说,使用operator.itemgetter
:
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