2013-07-22 54 views
2

我有代码看起来像这样:如何从Groovy中的REST客户端获取Slurpable数据?

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错误

所以我的问题是:如何获得JSON从RESTClient实现返回由JsonSlurper解析

回答

5

RESTClient?类自动解析内容,并且似乎不可能阻止它这样做。

但是,如果您使用HTTPBuilder,则可以重载该行为。要获取信息bac k作为文本,但如果仅将contentType设置为TEXT,则它将不起作用,因为HTTPBuilder使用HTTPBuilder.get()方法的contentType参数来确定要发送的HTTP头和Accept以及要在其上执行的解析返回的对象。在这种情况下,您需要在Accept标头中使用application/json,但您需要解析TEXT(即不解析)。

解决方法是在调用get()之前在HTTPBuilder对象上设置Accept标题。这会覆盖否则会在其上设置的标题。下面的代码为我运行。

@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) 
+0

这只是完美的作品!谢谢!我会说,当我转换时,我错过了从“parseText”中“解析”的变化。上面的“json”变量实际上是一个StringReader,所以“parse”是必需的方法。 – JoeG

+0

看起来像一个很好的解决方法,但不是任何人都好奇,为什么当响应是JSON RESTClient返回一个HashMap?我得到了同样的东西,我想了解为什么它返回一个hashmap,以及如何将其转换为JSON(如果这不是一个bug) – Marc

+0

我现在明白了,我会发布另一个解决方案 – Marc

0

由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()) 
} 
+0

但是,如果您需要支持通过代理服务器,使用HttpBuilder将会更好。 – JoeG

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") ....

相关问题