尝试解析 json 时位置 0 出现意外字符 (g) - HttpResponseDecorator

Unexpected character (g) at position 0 when trying to parse json - HttpResponseDecorator

每当我尝试执行下面的脚本时,我总是收到错误消息,显示意外字符 (g)。 基本上我希望能够解析 json 响应并能够从中获取上游作业名称。

脚本:

@Grapes([
        @Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1'),
        @Grab(group='commons-collections', module='commons-collections', version='3.2.1'),
        @Grab(group='org.jsoup', module='jsoup', version='1.10.2'),
        @Grab(group='org.json', module='json', version='20190722'),
        @Grab(group='com.googlecode.json-simple', module='json-simple', version='1.1.1')
])



import static groovyx.net.http.ContentType.*
import groovyx.net.http.HttpResponseException
import groovyx.net.http.RESTClient
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
import java.net.*
import java.util.*
import org.json.simple.*
import org.json.simple.parser.JSONParser;


def getRestClient(){
    String jenkinsUrl="http://somedomainname:8080"
    def restClient = new RESTClient(jenkinsUrl)
    return restClient
}

def getJobsInfo(String jobname,RESTClient restClient){
    def requrl= '/job/'+jobname+'/lastBuild/api/json/?pretty=true'
    def response = restClient.get( path : requrl)
    return response
}

def writeToPropertyFile(){
    def jsonResponseObject = getJobsInfo("sampleJobName",getRestClient())
    println "\n\n\n\n\n Json String :----   "+ jsonResponseObject.toString()

    JSONParser jsonParser = new JSONParser();
    JSONObject jsonObject = (JSONObject) jsonParser.parse(jsonResponseObject.toString());

    JSONArray upstreamJobInfoArray = jsonObject.getJSONArray("causes");

    for (int i = 0; i < upstreamJobInfoArray.length(); i++) {
        JSONObject jobCauses = upstreamJobInfoArray.getJSONObject(i);
        String upstreamProjectName = jobCauses.getString("upstreamProject");
        println upstreamProjectName
    }
}

writeToPropertyFile()

错误:

 Json String :----   groovyx.net.http.HttpResponseDecorator@6b063470
Caught: Unexpected character (g) at position 0.
Unexpected character (g) at position 0.
        at org.json.simple.parser.Yylex.yylex(Yylex.java:610)
        at org.json.simple.parser.JSONParser.nextToken(JSONParser.java:269)
        at org.json.simple.parser.JSONParser.parse(JSONParser.java:118)
        at org.json.simple.parser.JSONParser.parse(JSONParser.java:81)
        at org.json.simple.parser.JSONParser.parse(JSONParser.java:75)
        at org.json.simple.parser.JSONParser$parse.call(Unknown Source)
        at getUpstreamJob.writeToPropertyFile(getUpstreamJob.groovy:39)
        at getUpstreamJob.run(getUpstreamJob.groovy:50)

编辑 1:开始

JSON 我正在尝试解析的响应:

{
    "_class": "hudson.model.FreeStyleBuild",
    "actions": [
        {
            "_class": "hudson.model.CauseAction",
            "causes": [
                {
                    "_class": "hudson.model.Cause$UpstreamCause",
                    "shortDescription": "Started by upstream project \"sampleJobName\" build number 712",
                    "upstreamBuild": 712,
                    "upstreamProject": "sampleJobName",
                    "upstreamUrl": "job/sampleJobName/"
                },
                {
                    "_class": "hudson.model.Cause$UserIdCause",
                    "shortDescription": "Started by user Malick, Asif",
                    "userId": "asifma00",
                    "userName": "Malick, Asif"
                },
                {
                    "_class": "com.sonyericsson.rebuild.RebuildCause",
                    "shortDescription": "Rebuilds build #300",
                    "upstreamBuild": 300,
                    "upstreamProject": "sampleJobName",
                    "upstreamUrl": "view/ABCProjectView/job/sampleJobName/"
                }
            ]
        },
        {
            "_class": "hudson.model.ParametersAction",
            "parameters": [
                {
                    "_class": "hudson.model.StringParameterValue",
                    "name": "SNAPSHOTNAME",
                    "value": "ABCDE_12121.2000-2121212121212"
                },
                {
                    "_class": "hudson.model.StringParameterValue",
                    "name": "BUILD_LABEL",
                    "value": "ABCDE_12121.2000"
                }
            ]
        },
        {},
        {},
        {},
        {},
        {
            "_class": "hudson.plugins.parameterizedtrigger.BuildInfoExporterAction"
        },
        {},
        {},
        {},
        {}
    ],
    "artifacts": [],
    "building": false,
    "description": null,
    "displayName": "#301",
    "duration": 1199238,
    "estimatedDuration": 1194905,
    "executor": null,
    "fullDisplayName": "sampleJobName #301",
    "id": "301",
    "keepLog": false,
    "number": 301,
    "queueId": 189076,
    "result": "SUCCESS",
    "timestamp": 1583500786857,
    "url": "http://somedomainname:8080/job/sampleJobName/301/",
    "builtOn": "Server12345",
    "changeSet": {
        "_class": "hudson.scm.EmptyChangeLogSet",
        "items": [],
        "kind": null
    },
    "culprits": []
}

编辑 1:结束

我已经尝试查看几个 Stack Overflow 问题,但仍然无法解决。

请指导。

这是因为您没有获得实际的 JSON 字符串,您在 groovyx.net.http.HttpResponseDecorator class.

上获得了 toString() 输出

你可以看到它打印在这里(虽然很容易错过......我第一次看就错过了):

 Json String :----   groovyx.net.http.HttpResponseDecorator@6b063470

认为你需要调用jsonResponseObject.data来获取解析后的数据,它可能甚至return 你 Map 从 JSON 解析(这样你就可以摆脱所有 JSON 对象代码)。通过更改为进行测试:

    def data = jsonResponseObject.data
    println "\n\n\n\n\n Json ${data.getClass().name} :----  $data" jsonResponseObject.toString()

如果是 java.util.Map,您可以将第二部分简化为:

    JSONParser jsonParser = new JSONParser();
    JSONObject jsonObject = (JSONObject) jsonParser.parse(jsonResponseObject.toString());

    JSONArray upstreamJobInfoArray = jsonObject.getJSONArray("causes");

    for (int i = 0; i < upstreamJobInfoArray.length(); i++) {
        JSONObject jobCauses = upstreamJobInfoArray.getJSONObject(i);
        String upstreamProjectName = jobCauses.getString("upstreamProject");
        println upstreamProjectName
    }

收件人(使用上面的 data):

    data.actions.causes.upstreamProject.flatten().each { println it }