【问题标题】:Why json output so small?为什么json输出这么小?
【发布时间】:2023-03-14 10:42:01
【问题描述】:

这个输出应该比这里的长。

我从一个 GET 请求开始,我解析一个 JSON 列表并提取 ID,然后我在第二个函数上调用它,这将给我第二个 ID,然后我将使用它来调用第三个函数。但是,我只获得一个条目,而我应该获得更多条目。

代码如下:

from requests.auth import HTTPBasicAuth
import requests
import json
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def countries():
    data = requests.get("https://localhost:8543/api/netim/v1/countries/", verify=False, auth=HTTPBasicAuth("admin", "admin"))
    rep = data.json()
    return [elem.get("id","") for elem in rep['items']]


def regions():
    for c in countries():
        url = requests.get("https://localhost:8543/api/netim/v1/countries/{}/regions".format(c), verify=False, auth=HTTPBasicAuth("admin", "admin"))
        response = url.json()
        return [cid.get("id","") for cid in response['items']]


def city():
    for r in regions():
        api = requests.get("https://localhost:8543/api/netim/v1/regions/{}/cities".format(r), verify=False, auth=HTTPBasicAuth("admin", "admin"))
        resolt = api.json()
        return(json.dumps([{"name":r.get("name",""),"id":r.get("id", "")} for r in resolt['items']], indent=4))
city()

print(city())

输出如下:

[
    {
        "name": "Herat",
        "id": "AF~HER~Herat"
    }
]

我应该有一个巨大的列表,所以我不确定我错过了什么?

【问题讨论】:

  • 听起来更像是服务器端问题,而不是客户端问题
  • return 在循环的第一次迭代中
  • 只有countries() 返回的第一个项目实际上在regions() 中得到处理:你得到那个的响应,然后是return,从而结束函数。同样,city() 只处理来自regions() 的第一项,然后返回。
  • @Macattack 谢谢,我不确定我明白吗?我不是一个大程序员,所以你能澄清一下吗?
  • @jasonharper 谢谢杰森,但如果我打印第二个函数的结果,我确实得到了来自所有国家的所有地区。那么为什么函数不将所有 id 传递给第三个呢?

标签: python json api rest


【解决方案1】:

您需要遍历循环的所有迭代并收集结果,然后将其 jsonify 并返回。

data = []
for r in regions():
    api = requests.get("https://localhost:8543/api/netim/v1/regions/{}/cities".format(r), verify=False, auth=HTTPBasicAuth("admin", "admin"))
    resolt = api.json()
    data.extend([{"name":r.get("name",""),"id":r.get("id", "")} for r in resolt['items']])
return json.dumps(data, indent=4)

这将是对city() 的修复,但您在所有函数中都存在相同的问题。 return 立即退出函数并且不执行任何其他操作,实际上您所有的 for 循环都在执行 1 次迭代。

我将在此处更新我的示例,让您更好地了解正在发生的事情。

你的功能基本上是这样的:

def test_fn():
    for i in [1,2,3,4]:
        return i
# output:
1
# We never see 2 or 3 or 4 because we return before looping on them.

你想要什么:

def test_fn():
    results = []
    for i in [1,2,3,4]:
        results.append(i)
    return results
# output
[1,2,3,4]

您似乎了解for 循环将对列表中的每个元素执行一次操作。你不明白的是return 现在结束了函数。没有更多的 for 循环,没有更多的操作,在您的代码中,您立即返回到 for 循环内,停止任何进一步的操作。

【讨论】:

  • 谢谢,我明白了,但是如何存储上述函数?我不确定我是否理解如何让我正在寻找的价值观感到痛苦?
  • @AlexandreAmaralBednell 我添加了更多示例,如果您不明白,请告诉我
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2020-10-23
相关资源
最近更新 更多