感谢。
尝试使用python从json数据中获取特定键值。逻辑是调用函数和函数应该返回键(json输出有时只是1个索引数据或者比1个索引数据更多)
我能够获取数据并打印它们,它在内部for循环中工作正常,但是当我返回main时,我只得到一个值。不确定是否与for循环有关。
json数据:
[{
id: "587e569472",
hostname: "I-56BXX",
env: "Beta",
site: "I",
version: "2.0.0.38-1"},
{
id: "587e64472",
hostname: "I-56AXX",
env: "Beta",
site: "I",
version: "2.0.0.39-1"}]
主脚本:
def get_jsondata(url, hosts):
u = urllib2.urlopen(url)
json_object = json.load(u)
u.close
indexcount = len(json_object)
#print indexcount
#for i in json_object:
#print i['hostname']
if json_object == []:
print 'No Data!'
else:
for rows in json_object:
#print 'hostname:' + rows['hostname']
#print 'env:' + rows['env']
print 'hostname and its env:' + rows['hostname'] + " " + rows['env']
#return rows['hostname']
hosts = rows['hostname']
#print hosts
return (hosts)
#if __name__ == '__main__':
# main()
#main section
url = 'http://api.com/AppData/'
hosts = ""
hosts = get_jsondata(url, hosts)
#print "The required hostname " + str(hostname) + " and its env is " + str(venue)
print(hosts)
运行脚本后输出为:
hostname and its env:I-56BXX I
I-56BXX
我试图让两个主机名都返回main,输出就像
hostname and its env:I-56BXX I
hostname and its env:I-56AXX I
I-56BXX
I-56AXX
上面输出的第2行是来自print stmt里面的for循环,接下来的2行来自返回数据。
答案 0 :(得分:2)
好吧,你的return语句在循环中,所以它在第一次迭代时返回,你可以使用像yield
这样的东西,或者将你的结果存入你将在函数末尾返回的列表
喜欢
return [row['hostname'] for row in json_object]
答案 1 :(得分:0)
您只在json_object
打印一条记录的原因是因为您过早地返回hosts
。如果从for循环中删除行return (hosts)
,则会打印json_object
中的所有记录。
您希望最终获得的格式需要更多的工作。将要打印的格式如下所示:
hostname and its env:I-56BXX I
I-56BXX
hostname and its env:I-56AXX I
I-56AXX
如果您想以所述格式打印,您应该有一个for循环打印第一条消息,第二个for循环打印第二条消息。
答案 2 :(得分:0)
创建一个空列表,追加到列表中,然后将返回值移到循环外部。其他答案更清晰,更好,但这是您的代码最直接的解决方法:
def get_jsondata(url, hosts):
u = urllib2.urlopen(url)
json_object = json.load(u)
u.close
indexcount = len(json_object)
#print indexcount
#for i in json_object:
#print i['hostname']
if json_object == []:
print 'No Data!'
else:
hosts = []
for rows in json_object:
#print 'hostname:' + rows['hostname']
#print 'env:' + rows['env']
print 'hostname and its env:' + rows['hostname'] + " " + rows['env']
#return rows['hostname']
hosts.append(rows['hostname'])
#print hosts
return (hosts)
答案 3 :(得分:0)
请不要在StackOverflow上发布评论代码:它很难阅读。 保持你的片段简单。另外,你的代码不是很干净(return语句中的括号,与print语句上的括号不一致,函数调用上缺少括号u.close () ...)
据说,get_jsondata
只输出一个值,因为您的 for循环中有return
语句。 return
指令在第一次迭代期间中断循环。
现在我没有得到get_jsondata
应该返回的内容。通过阅读您的代码,我猜这是一个主机名列表。为了返回json数据中所有主机名的列表,您可以使用python的一个强大功能: list comprehension 。
<强> e.g 强>
[x['hostname'] for x in json_object]