Groovy HTTPBuilder在解析有效的json时产生错误 [英] Groovy HTTPBuilder producing error when parsing valid json

查看:261
本文介绍了Groovy HTTPBuilder在解析有效的json时产生错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一名Groovy新手,试图从groovy脚本连接到GitHub API,但是当HTTPBuilder尝试解析JSON响应时,我收到了一个奇怪的错误。



<我的简单脚本如下:

  @Grab(group ='org.codehaus.groovy.modules.http-builder' ,module ='http-builder',version ='0.7.2')
import groovyx.net.http。*
import static groovyx.net.http.ContentType。*
import static groovyx.net.http.Method。*

def apiToken ='[api_token]'

def http = new HTTPBuilder('https://api.github.com/ ')

//执行GET请求,期待JSON响应数据
http.request(GET,JSON){

uri.path ='/ orgs / ('''''')。'Accept'='application / json'
headers.'Authorization'='Basic'+(apiToken +':')。bytes.encodeBase64()。toString()
headers.'User-Agent'='[username]'

//一个suc的响应处理程序cess响应代码:
response.success = {resp,json - >
println resp.statusLine
}

//任何失败状态代码的处理程序:
response.failure = {resp - >
println意外的错误:$ {resp.statusLine.statusCode}:$ {resp.statusLine.reasonPhrase}
}
}

但是当解析JSON时,我得到以下错误:

  Sep 06,2014 10:21:54 PM groovyx.net.http.HTTPBuilder $ 1 handleResponse 
警告:解析'application / json; charset = utf-8'response
groovy.json.JsonException:期望'}'或','但得到当前字符''',其整数值为34

当前字符读取是''',其int值为34
期望'}'或','但获得当前字符''',其中int值为34
行号1
索引号256 $ b $ {[id:417862,name:octokit.rb,full_name:octokit / octokit.rb,owner:{login:octokit,id 3430433,avatar_url:https://avatars.githubusercontent.com/u/3430433?v=2,gravatar_id:43f38795089d56a2a7092b7d0c71fa76,url:h
...... .................................................. .................................................. .................................................. .................................................. .................................................. ^
at groovy.json.internal.JsonParserCharArray.complain(JsonParserCharArray.java:162)
at groovy.json.internal.JsonParserCharArray.decodeJsonObje CT(JsonParserCharArray.java:152)
在groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:196)
在groovy.json.internal.JsonParserCharArray.decodeJsonObject(JsonParserCharArray.java:140)在groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:196)

在groovy.json.internal.JsonParserCharArray.decodeJsonArray(JsonParserCharArray.java:346)
在groovy.json .internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:192)
at groovy.json.internal.JsonParserCharArray.decodeValue(JsonParserCharArray.java:166)
at groovy.json.internal.JsonParserCharArray.decodeFromChars(JsonParserCharArray .java:45)
at groovy.json.internal.JsonParserCharArray.parse(JsonParserCharArray.java:409)
at groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:121)
在groovy.json.JsonSlurper.parse(JsonSlurper.java:224)
在groovyx.net.http.Parse rRegistry.parseJSON(ParserRegistry.java:280)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
。在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.groovy.reflection.CachedMethod。 invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1207)
在groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1074)
在groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
在groovy.lang.Closure.call(Closure.java :423)
在groovy.lang.Closure.call(Closure.java:439)
在groovyx.net.http.HTTPBuilder.parseResponse(HTTPBuilder.java:560)
在groovyx。 net.http.HTTPBuilder $ 1.handleResponse(HTTPB uilder.java:489)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1070)
at org.apache.http.impl.client.AbstractHttpClient.execute( $ HTTP $ $
在groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:515)
在groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:434)
在groovyx.net.http.HTTPBuilder.request(HTTPBuilder.java:383)
在groovyx.net.http.HTTPBuilder $ request.call(未知源)
在org.codehaus.groovy。 runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
在org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
在org.codehaus.groovy。 runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)在sprint-snapshot.run
(冲刺-snapshot.groovy:11)
。在groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java: 258)
在groovy.lang.GroovyShell.run(GroovyShell.java:50 2)
在groovy.lang.GroovyShell.run(GroovyShell.java:491)
在groovy.ui.GroovyMain.processOnce(GroovyMain.java:650)
在groovy.ui.GroovyMain .run(GroovyMain.java:381)
at groovy.ui.GroovyMain.process(GroovyMain.java:367)
at groovy.ui.GroovyMain.processArgs(GroovyMain.java:126)
。在groovy.ui.GroovyMain.main(GroovyMain.java:106)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57 )
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus。 groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:106)
在org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:128)

抓住:groovyx.net .http.ResponseParseException:确定
groovyx.net.http.ResponseParseException:确定
在groovyx.net .http.HTTPBuilder $ 1.handleResponse(HTTPBuilder.java:495)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1070)
at org.apache.http。 impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1044)
at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:515)
at groovyx.net.http.HTTPBuilder.doRequest( HTTPBuilder.java:434)
at groovyx.net.http.HTTPBuilder.request(HTTPBuilder.java:383)
at groovyx.net.http.HTTPBuilder $ request.call(Unknown Source)
在sprint-snapshot.run(sprint-snapshot.groovy:11)
引起:groovy.json.JsonException:期待'}'或','但得到当前字符''',其int值为34

当前读取的字符是''',其中int值为34
,期望得到'}'或',',但得到的当前字符'''的整数值为34
行号1
索引号256
[{id:417862,name:octokit.rb,full_name:octokit / octokit.rb,owne R :{ 登录 : octokit, 标识:3430433, avatar_url: https://avatars.githubusercontent.com/u/3430433?v=2, gravatar_id: 43f38795089d56a2a7092b7d0c71fa76, url:h
........................................ .................................................. .................................................. .................................................. .................................................. ................ ^
at groovyx.net.http.ParserRegistry.parseJSON(ParserRegistry.java:280)
at groovyx.net.http.HTTPBuilder .parseResponse(HTTPBuilder.java:560)
at groovyx.net.http.HTTPBuilder $ 1.handleResponse(HTTPBuilder.java:489)
... 7 more

这个错误似乎表明无效的JSON,但是我已经证实了这个响应的确是有效的,正如你对Github API的期望。 b
$ b

更奇怪的是,如果我完全删除'Authorization'头并发送未经验证的请求,它会正常工作: S

解决方案

这是Groovy最新版本的问题。我遇到过同样的问题。你的代码应该可以在2.3.0之前使用Groovy的版本。或者,您可以为HTTPBuilder尝试不同的默认JSONParserType。

请参阅
http://beta.groovy-lang.org/docs/groovy-2.3.0/html/gapi/groovy/json/JsonSlurper.html
http:// alfonsorv.com/instruct-groovy-httpbuilder-to-handle-a-json-response-with-wrong-content-type/


I'm a Groovy novice and trying to connect to the GitHub API from a groovy script however I am getting a strange error when HTTPBuilder tries to parse the JSON response.

My simple script is as follows

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.2' )
import groovyx.net.http.*
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*

def apiToken = '[api_token]'

def http = new HTTPBuilder( 'https://api.github.com/' )

// perform a GET request, expecting JSON response data
http.request( GET, JSON ) {

  uri.path = '/orgs/octokit/repos'
  headers.'Accept' = 'application/json'
  headers.'Authorization' = 'Basic ' + (apiToken + ':').bytes.encodeBase64().toString()
  headers.'User-Agent' = '[username]'

  // response handler for a success response code:
  response.success = { resp, json ->
    println resp.statusLine
  }

  // handler for any failure status code:
  response.failure = { resp ->
    println "Unexpected error: ${resp.statusLine.statusCode} : ${resp.statusLine.reasonPhrase}"
  }
}

But when the JSON is parsed I get the following Error

Sep 06, 2014 10:21:54 PM groovyx.net.http.HTTPBuilder$1 handleResponse
WARNING: Error parsing 'application/json; charset=utf-8' response
groovy.json.JsonException: expecting '}' or ',' but got current char '"' with an int value of 34

The current character read is '"' with an int value of 34
expecting '}' or ',' but got current char '"' with an int value of 34
line number 1
index number 256
[{"id":417862,"name":"octokit.rb","full_name":"octokit/octokit.rb","owner":{"login":"octokit","id":3430433,"avatar_url":"https://avatars.githubusercontent.com/u/3430433?v=2","gravatar_id":"43f38795089d56a2a7092b7d0c71fa76","url":"h
................................................................................................................................................................................................................................................................^
    at groovy.json.internal.JsonParserCharArray.complain(JsonParserCharArray.java:162)
    at groovy.json.internal.JsonParserCharArray.decodeJsonObject(JsonParserCharArray.java:152)
    at groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:196)
    at groovy.json.internal.JsonParserCharArray.decodeJsonObject(JsonParserCharArray.java:140)
    at groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:196)
    at groovy.json.internal.JsonParserCharArray.decodeJsonArray(JsonParserCharArray.java:346)
    at groovy.json.internal.JsonParserCharArray.decodeValueInternal(JsonParserCharArray.java:192)
    at groovy.json.internal.JsonParserCharArray.decodeValue(JsonParserCharArray.java:166)
    at groovy.json.internal.JsonParserCharArray.decodeFromChars(JsonParserCharArray.java:45)
    at groovy.json.internal.JsonParserCharArray.parse(JsonParserCharArray.java:409)
    at groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:121)
    at groovy.json.JsonSlurper.parse(JsonSlurper.java:224)
    at groovyx.net.http.ParserRegistry.parseJSON(ParserRegistry.java:280)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1207)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1074)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
    at groovy.lang.Closure.call(Closure.java:423)
    at groovy.lang.Closure.call(Closure.java:439)
    at groovyx.net.http.HTTPBuilder.parseResponse(HTTPBuilder.java:560)
    at groovyx.net.http.HTTPBuilder$1.handleResponse(HTTPBuilder.java:489)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1070)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1044)
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:515)
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:434)
    at groovyx.net.http.HTTPBuilder.request(HTTPBuilder.java:383)
    at groovyx.net.http.HTTPBuilder$request.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
    at sprint-snapshot.run(sprint-snapshot.groovy:11)
    at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:258)
    at groovy.lang.GroovyShell.run(GroovyShell.java:502)
    at groovy.lang.GroovyShell.run(GroovyShell.java:491)
    at groovy.ui.GroovyMain.processOnce(GroovyMain.java:650)
    at groovy.ui.GroovyMain.run(GroovyMain.java:381)
    at groovy.ui.GroovyMain.process(GroovyMain.java:367)
    at groovy.ui.GroovyMain.processArgs(GroovyMain.java:126)
    at groovy.ui.GroovyMain.main(GroovyMain.java:106)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:106)
    at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:128)

Caught: groovyx.net.http.ResponseParseException: OK
groovyx.net.http.ResponseParseException: OK
    at groovyx.net.http.HTTPBuilder$1.handleResponse(HTTPBuilder.java:495)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1070)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1044)
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:515)
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:434)
    at groovyx.net.http.HTTPBuilder.request(HTTPBuilder.java:383)
    at groovyx.net.http.HTTPBuilder$request.call(Unknown Source)
    at sprint-snapshot.run(sprint-snapshot.groovy:11)
Caused by: groovy.json.JsonException: expecting '}' or ',' but got current char '"' with an int value of 34

The current character read is '"' with an int value of 34
expecting '}' or ',' but got current char '"' with an int value of 34
line number 1
index number 256
[{"id":417862,"name":"octokit.rb","full_name":"octokit/octokit.rb","owner":{"login":"octokit","id":3430433,"avatar_url":"https://avatars.githubusercontent.com/u/3430433?v=2","gravatar_id":"43f38795089d56a2a7092b7d0c71fa76","url":"h
................................................................................................................................................................................................................................................................^
    at groovyx.net.http.ParserRegistry.parseJSON(ParserRegistry.java:280)
    at groovyx.net.http.HTTPBuilder.parseResponse(HTTPBuilder.java:560)
    at groovyx.net.http.HTTPBuilder$1.handleResponse(HTTPBuilder.java:489)
    ... 7 more

The error seems to suggest invalid JSON however I have confirmed the response is indeed valid, as you would expect from the Github API.

What is even stranger, is if I remove the 'Authorization' header completely and send the request unauthenticated, it works fine :S

解决方案

It's an issue with the latest release of Groovy. I had the same issue. Your code should work with version of Groovy before 2.3.0. Optionally you can try a different default JSONParserType for HTTPBuilder.

See http://beta.groovy-lang.org/docs/groovy-2.3.0/html/gapi/groovy/json/JsonSlurper.html http://alfonsorv.com/instruct-groovy-httpbuilder-to-handle-a-json-response-with-wrong-content-type/

这篇关于Groovy HTTPBuilder在解析有效的json时产生错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆