使用Python解析JSON文件并在特定条件下选择多个值

2024-04-29 08:34:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个JSON文件。你知道吗

{  
   "reviewers":[  
      {  
         "user":{  
            "name":"keyname",
            "emailAddress":"John@email",
            "id":3821,
            "displayName":"John Doe",
            "active":true,
            "slug":"jslug",
            "type":"NORMAL",
            "link":{  
               "url":"/users/John",
               "rel":"self"
            },
         },
         "role":"REVIEWER",
         "approved":true
      },
      {  
         "user":{  
            "name":"keyname2",
            "emailAddress":"Harry@email",
            "id":6306,
            "displayName":"Harry Smith",
            "active":true,
            "slug":"slug2",
            "link":{  
            "type":"NORMAL",
               "url":"/users/Harry",
               "rel":"self"
            },
         },
         "role":"REVIEWER",
         "approved":false
      }
   ],
}

最初,我使用的是一段代码,它将遍历并获取审阅者的全名。你知道吗

def get_reviewers(json):
    reviewers = ""
    for key in json["reviewers"]:
        reviewers += key["user"]["displayName"] + ", "
    reviewers = reviewers[:-2]
    return reviewers

返回"John Doe, Harry Smith"。但是,现在我正在尝试获取它,这样如果用户的标记等于true "approved"=true,脚本就会在用户名旁边返回a(a)。你知道吗

例如,上面的代码将获得名称,然后看到John的approved标记为true,Harry的为false,然后返回"John Doe(A), Harry Smith"。我只是不知道从哪里开始。有人能给我指出正确的方向吗?你知道吗

这是我迄今为止一直在尝试的,但显然它并没有像我希望的那样工作。你知道吗

def get_reviewers(stash_json):
    reviewers = ""
    for key in stash_json["reviewers"]:
        if stash_json["reviewers"][0]["approved"] == true:
            reviewers += key["user"]["displayName"] + "(A)" + ", "
        else:
            reviewers += key["user"]["displayName"] + ", "
    reviewers = reviewers[:-2]
    return reviewers

输出Jason Healy(A), Joan Reyes(A)

这就是我的stash_json通过pprint输出的内容。你知道吗


Tags: keynamejsontrueemailjohnsmithdoe
2条回答

这看起来是使用join和列表理解的好地方:

def get_reviewers(stash_json):
   return ", ".join([item['user']['displayName'] + ('(A)' if item['approved'] else '') for item in stash_json['reviewers']])

你可能想要这样的东西:

def get_reviewers(stash_json):
    reviewers = ""
    for item in stash_json["reviewers"]:
        if item["approved"]:
            reviewers += item["user"]["displayName"] + "(A)" + ", "
        else:
            reviewers += item["user"]["displayName"] + ", "
    reviewers = reviewers[:-2]
    return reviewers

我认为你的困惑部分来自于这样一个事实,即“reviewers”是listdict元素,每个dict元素都有一个键值approved,但也有一个键“user”,这个值本身就是另一个dict。你知道吗


仔细阅读JSON文件,出于调试目的,请使用大量

print(...)
print(type(...))   # whether something is a dict, list, str, bool etc

或者

from pprint import pprint    # pretty printing
pprint(...)

相关问题 更多 >