代码之家  ›  专栏  ›  技术社区  ›  Benihana

如何在Groovy中正确解析JSON

  •  -1
  • Benihana  · 技术社区  · 6 年前

    我不知道如何使用Groovy正确解析嵌套的JSON。我已经包含了一个可用的Python脚本,这样您就可以确切地看到我在Groovy中要做的事情。

    我需要解析的JSON:

    json_payload = {"number": 3585, "url": "https://jenkins.test.com/job/test/3585/",
                      "displayName": "test_3585", "timestamp": 1516992464686,
                      "actions": [{"causes": [{"userId": "test"}]}]}
    

    我想做什么(Python):

    class JenkinsParser:
        def __init__(self, json_data):
    
            self.display_name = json_data['displayName']
            self.url = json_data['url']
            self.start_time = json_data['timestamp']
            self.exec_url = json_data['url']
            self.exec_number = json_data['number']
            self.user = None
            actions = json_data['actions']
            for a in actions:
                if 'causes' in a:
                    for cause in a['causes']:
                        if 'userId' in cause:
                            self.user = cause['userId']
    
            url_split = self.execution_url.split("/job/")
            self.jenkins_url = url_split[0]
            self.job_name = url_split[-1].split("/")[0]
    

    注意:Groovy不一定需要是一个类,也不需要使用JSonSlurper

    如果我使用JsonSlurper

    def slurper = new groovy.json.JsonSlurper()
    def result = slurper.parseText(json_payload)
    

    我可以这样访问我需要的所有值吗?

    result.displayName
    result.url
    result.timestamp
    result.url
    result.number
    result.actions.causes.userId
    

    我不知道如何获取用户ID。。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Daniel    6 年前

    是的,您可以访问所描述的值。

    您可以访问用户ID,如 result​.actions.first().causes.first().userId​ 如果您确定数据的结构与此完全相同。如果您可能有或可能没有行动,或者可能有或可能没有原因,您可以执行以下操作 result​.actions?.first()?.causes?.first()?.userId​ 使您的访问安全为空,或者您可以使用( *. )如果可能有多个操作或原因,操作员可以访问用户ID。

    根据您对返回null的内容的评论,这是正常的:

    def json_payload = """{"number": 3585, "url": "https://jenkins.test.com/job/test/3585/", "displayName": "test_3585", "timestamp": 1516992464686, "actions": [{"causes": [{"userId": "test"}]}]}"""
    def slurper = new groovy.json.JsonSlurper()
    def result = slurper.parseText(json_payload)
    return result​.actions?.first()?.causes?.first()?.userId​
    

    并返回“test”。如果没有看到类似的结果,则实际数据中可能存在语法错误或不同的键。