【问题标题】:Selecting values from a JSON file in Python在 Python 中从 JSON 文件中选择值
【发布时间】:2016-10-10 22:42:57
【问题描述】:

我正在使用以下 python 代码获取 JIRA 数据,

如何存储多个键的响应(我的示例仅显示一个键,但通常我会获得大量数据)并打印与total,key, customfield_12830, summary对应的值

    import requests
    import json
    import logging
    import datetime
    import base64
    import urllib
    serverURL = 'https://jira-stability-tools.company.com/jira'
    user = 'username'
    password = 'password'
    query = 'project = PROJECTNAME AND "Build Info" ~ BUILDNAME  AND assignee=ASSIGNEENAME'
    jql = '/rest/api/2/search?jql=%s' % urllib.quote(query)
    response = requests.get(serverURL + jql,verify=False,auth=(user, password))
    print response.json()

response.json() 输出:-

http://pastebin.com/h8R4QMgB

【问题讨论】:

  • 如果您在此处修剪以仅显示一个项目的结构与您需要支持多个项目的结构不同,那么我们给您的任何答案都可能在其他情况下没有用处。
  • stackoverflow.com/questions/28069753/… 相关问题。也检查一下。
  • 顺便说一句,一般来说,如果你有想要弄清楚的深层嵌套结构(比如这个!),pprint 是你的朋友。见docs.python.org/2/library/pprint.html
  • Charles - 是否有一个外部链接我可以将我的示例输出粘贴到更多项目并在此处分享?
  • @PythonProg, ...您可能会注意到,pastebin.com 是我要求您不要使用的一个 pastebin - 对于不使用 AdBlock 或类似。

标签: python json


【解决方案1】:

从您粘贴到 pastebin 的链接和我看到的 json 中,您可以将 issues 作为包含 key, fields(which holds custom fields), self, id, expand 的列表。

您可以简单地遍历此响应并提取所需键的值。你可以去喜欢。

data = response.json()
issues = data.get('issues', list())

x = list()

for issue in issues:
    temp = {
        'key': issue['key'],
        'customfield': issue['fields']['customfield_12830'],
        'total': issue['fields']['progress']['total']
    }
    x.append(temp)
print(x)

x 是包含您提到的字段数据的字典列表。如果我有不清楚的地方或者我给出的不是你想要的,请告诉我。

PS: 始终建议使用 dict.get('keyname', None) 来获取值,因为如果 key 不是,您始终可以设置默认值成立。对于这个解决方案,我没有这样做,因为我只是想提供方法。

更新:在 cmets 中你(OP)提到它提供了属性错误。试试这个代码

data = response.json()
issues = data.get('issues', list())

x = list()

for issue in issues:
    temp = dict()
    key = issue.get('key', None)
    if key:
       temp['key'] = key 

    fields = issue.get('fields', None)
    if fields:
        customfield = fields.get('customfield_12830', None)
        temp['customfield'] = customfield

        progress = fields.get('progress', None)
        if progress:
            total = progress.get('total', None)
            temp['total'] = total

    x.append(temp)
print(x)

【讨论】:

  • 这给出了一个错误AttributeError: 'NoneType' object has no attribute 'get'
  • 我正在使用 Python 2.7.3,它是否适用于这个版本,它会像我上面所说的那样抛出错误
  • 这就是我提到使用 dict.get('keyname', None) 来确保您尝试访问的密钥确实存在的原因。对您来说,当您尝试再次访问其值为字典的“字段”或可能是再次为字典的“进度”时,会引发此错误。为避免它使用 fields = issue.get('fields', None)。然后如果字段则尝试访问其中的自定义字段
  • Rajesh - 你有没有使用任何工具来破译这个结构?你建议初学者如何理解这个结构并且必须自己做?
  • @PythonProg, ...我之前也曾建议将pprint 作为在 Python 世界中破译结构的工具。在 JSON 端,jq 或只是 python -m json.tool 通常就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
相关资源
最近更新 更多