【问题标题】:How to loop through / return all JSON responses in Python如何在 Python 中循环/返回所有 JSON 响应
【发布时间】:2016-02-04 17:28:51
【问题描述】:

前言:我曾经是一名轻量级桌面应用程序开发人员(VBA 和 SQL - 告我!),但我对 python 完全陌生。

我正在尝试在 Python 中打印 JSON 提要的输出作为训练练习:

JSON 网址 - http://www.nactem.ac.uk/software/acromine/dictionary.py?sf=uk

[
    {
        "lfs": [
            {
                "freq": 656,
                "lf": "United Kingdom",
                "since": 1980,
                "vars": [
                    {
                        "freq": 655,
                        "lf": "United Kingdom",
                        "since": 1980
                    },
                    {
                        "freq": 1,
                        "lf": "United-Kingdom",
                        "since": 2006
                    }
                ]
            },
            {
                "freq": 393,
                "lf": "urokinase",
                "since": 1969,
                "vars": [
                    {
                        "freq": 358,
                        "lf": "urokinase",
                        "since": 1969
                    },
                    {
                        "freq": 35,
                        "lf": "Urokinase",
                        "since": 1970
                    }
                ]
            },
            {
                "freq": 6,
                "lf": "uridine kinase",
                "since": 1977,
                "vars": [
                    {
                        "freq": 5,
                        "lf": "uridine kinase",
                        "since": 1977
                    },
                    {
                        "freq": 1,
                        "lf": "Uridine kinase",
                        "since": 2007
                    }
                ]
            },
            {
                "freq": 6,
                "lf": "urinary kallikrein",
                "since": 1985,
                "vars": [
                    {
                        "freq": 6,
                        "lf": "urinary kallikrein",
                        "since": 1985
                    }
                ]
            },
            {
                "freq": 4,
                "lf": "urea kinetics",
                "since": 1980,
                "vars": [
                    {
                        "freq": 2,
                        "lf": "urea kinetics",
                        "since": 1980
                    },
                    {
                        "freq": 2,
                        "lf": "urea kinetic",
                        "since": 1989
                    }
                ]
            },
            {
                "freq": 4,
                "lf": "University of Kentucky",
                "since": 2000,
                "vars": [
                    {
                        "freq": 4,
                        "lf": "University of Kentucky",
                        "since": 2000
                    }
                ]
            }
        ],
        "sf": "UK"
    }
]

到目前为止,我只研究了如何使用以下代码一次返回一个结果:

import urllib.request
import json

def main():

  SearchForAbbrev = input("Please enter an abbreviation to search for:")
  urlData = "http://www.nactem.ac.uk/software/acromine/dictionary.py?sf=" + SearchForAbbrev

  webUrl = urllib.request.urlopen(urlData)
  print (webUrl.getcode())
  if (webUrl.getcode() == 200):
    data = webUrl.read()
    data = data.decode("utf-8") 
    printResults(data)

  else:
    print ("Received an error from server, cannot retrieve results " + str(webUrl.getcode()))


def printResults(data):

  theJSON = json.loads(data)

  for i in theJSON:

    print(i["lfs"][0]["lf"])

我最初尝试使用 print(i["lfs"]["lf"]) 之类的东西时并不高兴。

TypeError: 列表索引必须是整数或切片,而不是 str

问题:如何循环遍历print(i["lfs"][0]["lf"]) 中的0(索引?)值以返回所有结果。

对于后续的奖励积分,我如何在vars 中返回所有相关结果?

【问题讨论】:

    标签: python json python-3.x


    【解决方案1】:

    如果您仔细查看正在输出的 JSON,您会发现:

    1. 字典数组
    2. 在每个字典中,lfs 是一个包含多个字典的数组。
    3. 在每个字典中都有一个名为 vars 的键,它是另一个字典数组。
    4. 可以在此字典中找到您要打印的键 lf

    因此,您只是错误地访问了 JSON 数据。您的打印功能应如下所示:

    def printResults(data):
        js = json.loads(data)
        for d in js:
            print(d["lfs"][0]["vars"][0]["lf"])
    

    或者,如果您想打印所有 lf 的:

    for d in js:
        for e in d["lfs"]:
            for f in e["vars"]:
                print(f["lf"])
    

    【讨论】:

    • 完美!我现在明白我哪里出错了——我知道我将不得不更加注意 JSON / Python 中括号的形状(卷曲 vs 正方形)!
    【解决方案2】:

    最自然地,循环可以通过...组织一个循环来完成:

      for i in theJSON:
        for j in i["lfs"]:
          print(j["lf"])
    

    也可以单行:

    print([j["lf"] for j in i["lfs"] for i in theJSON])
    

    那是幸福的道路。检查无效输入并为vars 执行此操作留作练习。

    【讨论】:

    • 感谢您的回答 - 我现在可以看到我的方式的错误!如果我可以将您和 Ganesh 的答案都标记为已接受,我会的。
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2017-03-25
    • 2013-08-22
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多