我的代码如下:
def client = new groovyx.net.http.RESTClient('myRestFulURL')
def json = client.get(contentType: JSON)
net.sf.json.JSON jsonData = json.data as net.sf.json.JSON
def slurper = new JsonSlurper().parseText(jsonData)
然而,它不起作用! :(上面的代码在parseText中给出了一个错误,因为没有引用json元素。最重要的问题是“数据”作为Map返回,而不是真正的Json。未显示,但是我的第一次尝试,我刚刚通过parseText(json.data),它给出了一个关于无法解析HashMap的错误。
所以我的问题是:如何让RESTClient返回的JSON被JsonSlurper解析?
答案 0 :(得分:6)
RESTClient类会自动解析内容,但似乎无法阻止内容。
但是,如果您使用HTTPBuilder,则可能会使行为超载。您希望以文本形式返回信息,但如果仅将contentType
设置为TEXT
,则无效,因为HTTPBuilder
使用contentType
参数HTTPBuilder.get()方法确定要发送的Accept
HTTP标头,以及对返回的对象进行的解析。在这种情况下,application/json
标头中需要Accept
,但您希望解析TEXT
(即不进行解析)。
您解决此问题的方法是在Accept
对象上设置HTTPBuilder
标头,然后再调用get()
。这将覆盖否则将在其上设置的标头。以下代码适用于我。
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.6')
import static groovyx.net.http.ContentType.TEXT
def client = new groovyx.net.http.HTTPBuilder('myRestFulURL')
client.setHeaders(Accept: 'application/json')
def json = client.get(contentType: TEXT)
def slurper = new groovy.json.JsonSlurper().parse(json)
答案 1 :(得分:1)
jesseplymale发布的解决方案也为我工作。
HttpBuilder依赖于某些appache库, 所以为了避免将这些依赖项添加到项目中, 你可以在不使用HttpBuilder的情况下使用这个解决方案:
def jsonSlurperRequest(urlString) {
def url = new URL(urlString)
def connection = (HttpURLConnection)url.openConnection()
connection.setRequestMethod("GET")
connection.setRequestProperty("Accept", "application/json")
connection.setRequestProperty("User-Agent", "Mozilla/5.0")
new JsonSlurper().parse(connection.getInputStream())
}
答案 2 :(得分:1)
RESTClient的响应类型取决于:
的版本 org.codehaus.groovy.modules.http-builder:http-builder
例如,对于版本0.5.2
,我得到了net.sf.json.JSONObject
。
在版本0.7.1
中,它现在根据问题的观察结果返回一个HashMap。
当它是地图时,您只需使用法线贴图操作即可访问JSON数据:
def jsonMap = restClientResponse.getData()
def user = jsonMap.get("user")
....