使用python在for循环中检索多个json数据

时间:2017-04-28 18:40:31

标签: python

感谢。

尝试使用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行来自返回数据。

4 个答案:

答案 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]