如何在Python中循环/返回所有JSON响应

时间:2016-02-04 17:28:51

标签: python json python-3.x

前言:我已经花了一些时间作为一个轻便的桌面应用程序开发人员(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:list indices必须是整数或切片,而不是str

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

对于奖励积分作为跟进,我如何在vars中返回所有相关结果?

2 个答案:

答案 0 :(得分:0)

最自然的是,循环可以通过...组织循环来完成:

  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执行此操作仅作为练习。

答案 1 :(得分:0)

如果仔细查看输出的JSON,您可以:

  1. 一系列dicts
  2. 在每个dict中,lfs是一个包含多个dicts的数组。
  3. 在每个dicts中都有一个名为vars的键,这是另一个dicts阵列。
  4. 在这个词典中,可以找到你正在尝试打印的键lf
  5. 因此,您只是错误地访问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"])