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

问题描述 投票:0回答:1

[每当我尝试执行以下脚本时,我都会不断出错,说出意外的字符(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:END

我尝试查看几个stackoverflow问题,但仍无法解决。

请指导。

json groovy grape json-simple
1个回答
1
投票

这是因为您没有获得实际的JSON字符串,而是在toString()类上获得了groovyx.net.http.HttpResponseDecorator输出。

您可以在这里看到它的打印内容(尽管很容易错过,但是我乍看之下还是🙂失了):

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

I think,您需要调用jsonResponseObject.data来获取已解析的数据,并且它可能甚至从JSON返回一个Map解析后的数据(因此您可以摆脱所有JSONObject代码)。通过更改为进行测试:

    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 }
© www.soinside.com 2019 - 2024. All rights reserved.