使用python检索for循环中的多个json数据
谢谢 我试图使用python从json数据中获取特定的键值。逻辑是调用函数,函数应返回键(json输出有时仅为1个索引数据,有时超过1个索引数据) 我能够得到数据并打印出来,它在内部for循环中运行良好,但当我返回main时,只得到一个值。不确定是否与for循环有关 json数据:使用python检索for循环中的多个json数据,python,Python,谢谢 我试图使用python从json数据中获取特定的键值。逻辑是调用函数,函数应返回键(json输出有时仅为1个索引数据,有时超过1个索引数据) 我能够得到数据并打印出来,它在内部for循环中运行良好,但当我返回main时,只得到一个值。不确定是否与for循环有关 json数据: [{ id: "587e569472", hostname: "I-56BXX", env: "Beta", site: "I", version: "2.0.0.38
[{
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
上面输出的前两行来自print stmt inside for循环,接下来的两行来自返回数据。好吧,您的返回语句在循环内,因此它在第一次迭代时返回,您可以使用类似于
的方法来产生或将结果存储到一个列表中,然后在函数结束时返回
差不多
return [row['hostname'] for row in json_object]
好的,您的return语句在循环中,因此它在第一次迭代时返回,您可以使用yield
之类的方法,或者将结果存储到函数末尾返回的列表中
差不多
return [row['hostname'] for row in json_object]
您在json\u对象中只打印一条记录的原因是您太快返回了hosts
。如果从for循环内部删除行return(hosts)
,则将打印json\u对象
中的所有记录
您希望最终使用的格式将需要更多的工作。将要打印的格式如下所示:
hostname and its env:I-56BXX I
I-56BXX
hostname and its env:I-56AXX I
I-56AXX
如果要以指定的格式打印,应该有一个for循环打印第一条消息,另一个for循环打印第二条消息。在json\u对象中只打印一条记录的原因是您返回主机的时间太短。如果从for循环内部删除行return(hosts)
,则将打印json\u对象
中的所有记录
您希望最终使用的格式将需要更多的工作。将要打印的格式如下所示:
hostname and its env:I-56BXX I
I-56BXX
hostname and its env:I-56AXX I
I-56AXX
如果您想以规定的格式打印,您应该有一个用于打印第一条消息的for循环和一个用于打印第二条消息的第二个for循环。创建一个空列表,附加到列表中,然后将您的返回移动到循环之外。其他答案更简洁、更出色,但下面是代码中最直接的修复方法:
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)
创建一个空列表,附加到列表中,然后将您的返回移动到循环之外。其他答案更简洁、更出色,但下面是代码中最直接的修复方法:
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)
请不要在StackOverflow上发布带有注释的代码:很难阅读。
让你的代码片段保持简单。另外,您的代码不是很干净(return语句中的括号、print语句中的括号不一致、函数调用u.close()中缺少括号……)
也就是说,get_jsondata
只输出一个值,因为for循环中有return
语句。return
指令在第一次迭代期间中断循环
现在我没有得到get\u jsondata
应该返回的内容。通过阅读您的代码,我猜这是一个主机名列表。为了返回json数据中所有主机名的列表,可以使用python的一个强大功能:列表理解
例如
[x['hostname'] for x in json_object]
请不要在StackOverflow上发布带有注释的代码:很难阅读。
让你的代码片段保持简单。另外,您的代码不是很干净(return语句中的括号、print语句中的括号不一致、函数调用u.close()中缺少括号……)
也就是说,get_jsondata
只输出一个值,因为for循环中有return
语句。return
指令在第一次迭代期间中断循环
现在我没有得到get\u jsondata
应该返回的内容。通过阅读您的代码,我猜这是一个主机名列表。为了返回json数据中所有主机名的列表,可以使用python的一个强大功能:列表理解
例如
[x['hostname'] for x in json_object]
hosts=[h['hostname']表示json_对象中的h]
您在循环的第一个迭代中从函数重新调谐hosts=[h['hostname']表示json_对象中的h]
您在循环的第一个迭代中从函数重新调谐。很高兴知道这个逻辑。谢谢Madahin。很高兴知道这个逻辑。