Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python检索for循环中的多个json数据_Python - Fatal编程技术网

使用python检索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

谢谢

我试图使用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

上面输出的前两行来自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。很高兴知道这个逻辑。