【问题标题】:Requesting to an API with python gives me incorrect outputs on Raspberry Pi使用 python 请求 API 在 Raspberry Pi 上给了我不正确的输出
【发布时间】:2020-03-24 08:28:37
【问题描述】:

所以我一直在创建一个调用API 以获取其 JSON 代码的 python 代码。

使用此代码请求 api 后:

url = requests.get("https://stats.foldingathome.org/api/donor/PointofHorizon")

然后我会将给定的 JSON 信息打印到控制台中以获取此输出:

{"wus": 131, "rank": 99964, "total_users": 2236318, "active_50": 2, "path": "donor/PointofHorizon", "wus_cert": "https://apps.foldingathome.org/awards?user=35025837&type=wus", "id": 35025837, "credit_cert": "https://apps.foldingathome.org/awards?user=35025837&type=score", "last": "2020-03-22 15:18:54", "name": "PointofHorizon", "teams": [{"wus": 97, "last": "2020-03-22 15:18:54", "uid": 35025837, "active_50": 2, "active_7": 2, "credit": 310435, "team": 225605, "name": "PC Master Race - PCMR"}, {"wus": 34, "last": "2019-08-17 13:00:11", "uid": 35025837, "active_50": 0, "active_7": 0, "credit": 431809, "team": 223518, "name": "LinusTechTips_Team"}], "active_7": 2, "credit": 742244}

这可以完美地在 Windows 机器上运行 python 代码,但如果我要在 Raspberry Pi 上运行这个精确的 python 代码,我会得到 JSON,但它会完全随机化。 请注意,windows 和 Pi 都运行完全相同的代码,windows 给了我我想要的输出,而 pi 不是。谁能解释为什么我在 Pi 上得到随机输出而不是 windows?

这里有一些 python 代码在 windows 和 Pi 上运行 3 次的屏幕截图,所以你可以明白我所说的随机是什么意思。但基本上它是从 pi 上的 API 获取信息,而不是以 API 页面上的正确顺序显示 JSON 文件:

窗户: 编辑:此窗口的 Python 版本是 Python 3.8.2

树莓派:

【问题讨论】:

  • 能否添加您在 windows 上运行的 python 版本?
  • 抱歉将其添加到问题中,但它是 3.8.2
  • 如果“随机化”是指键的顺序不同(抱歉,我不会尝试比较两个代码图像),那么这是由于 Python 3.8x dicts 被排序而导致的它们不在以前的版本中。这是一个实现细节,实际上完全无关紧要,因为 json 规范明确指出 json 对象是 unordered 键=>值的集合,因此无论如何您都不应该依赖键排序。

标签: python api raspberry-pi python-requests


【解决方案1】:

这是一个预期的行为:JSON standard 状态:

对象是一组无序的名称/值对。

因此生成的 JSON 没有“正确”或“不正确”的顺序。

为什么顺序在 Windows 上没有改变,但在 Raspberry Pi 上却改变了,这是因为您运行的 Python 版本不同。从 Python 3.7 开始,dict 现在是有序的并保留插入的顺序。

如果您想要一致的结果,请在两台机器上运行相同版本的 python。你也可以考虑使用OrderedDict,或者对结果字典进行排序(使用sorted(json_response)),如果顺序对你来说真的很重要的话。

【讨论】:

    【解决方案2】:

    我相信您会观察到,在python3.5 中,字典中的键顺序无法保证。你的 API 返回的 JSON 字符串可能是相同的(毕竟它来自同一个服务器)。但是,当python 将其转换为字典时,它不尊重键的顺序。

    如果您想保留此信息,请考虑升级到 python3.7+,其中字典顺序现在是确定性的(请参阅 release notes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-21
      • 2022-11-17
      • 2012-11-06
      • 2020-10-05
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多