2009-08-24 37 views
6

我试图通过他们的JSON导出访问站点。Groovy/Grails中的JSON

的网址是:http://neotest.dabbledb.com/publish/neotest/f820728c-4451-41f6-b346-8cba54e52c6f/projects.jsonp

我使用HTTPBuilder尝试在Groovy中做到这一点,但我有麻烦。我使用的示例代码http://groovy.codehaus.org/HTTP+Builder拿出这样的:

// perform a GET request, expecting JSON response data 
http.request(GET, JSON) { 
    url.path = 'publish/neotest/f820728c-4451-41f6-b346-8cba54e52c6f/projects.jsonp' 

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

     // parse the JSON response object: 
     json.responseData.results.each { 
      println " ${it.titleNoFormatting} : ${it.visibleUrl}" 
     } 
    } 
} 

然而,当我运行该方法的单元测试,我只是让我听唔明No such property: GET for class: ProjectController groovy.lang.MissingPropertyException: No such property: GET for class: ProjectController

回答

14

您的示例代码有几个问题。首先,访问GET和方式,你需要静态导入JSON:

import static groovyx.net.http.Method.GET 
import static groovyx.net.http.ContentType.JSON 

这将使代码编译,但无法成功运行。你的url.path值需要一个前导'/'(如HTTPBuilder page所示)。更重要的是,从the URL you're referencing返回的JSON与执行Google搜索的示例代码返回的结构完全不同。如果您将your URL加载到非常方便的JSON Formatter service at CuriousConcept中,您会看到结构。这里的代码,将显示一些JSON数据:

println json.name 
println json.id 
json.fields.each { 
    println it 
} 

顺便说一句,有一个在version 0.5.0 of HTTPBuilder重大更改是相关的验证码。由于RC-1发布公告状态,

的HTTPBuilder类的URL属性已更名为URI

所以,如果你在某个点移动到0.5.0,你需要使用uri.path代替url.path

0

我不熟悉HTTPBuilder,但看着的文件,你也许可以用

http.request(Method.GET, ContentType.JSON) { 

更换

http.request(GET, JSON) { 

您可能还需要获得通过:

import groovyx.net.http.Method 
import groovyx.net.http.ContentType 

我基于这个文件的HttpBuilder.request(),这需要一个Method和一个对象(可以是一个ContentType)。

+0

我没有任何延伸拘泥于HTTPBuilder,这只是哪几个顶级谷歌项建议JSON从Grails的要求。如果还有其他的解决方案,我会尽力而为,因为我在这里没有取得很大的进展。 – Kivus 2009-08-24 18:28:57

+0

很多人推荐Apache的HttpClient,HTTP Builder似乎是基于它的,所以它可能是最好的选择。我只是试图帮助你解决Groovy脚本中出现的编译错误。如果HTTP Builder不起作用,那么你可以在Groovy中使用HttpClient或甚至java.net。*编写一些直接的Java,尽管它会有更多的代码。 – 2009-08-24 18:32:05

-3

虽然没有回答原来的问题,但我注意到你问了其他可能的库。忽略我没有用过的Groovy,我认为最好和最简单的用于构建Web服务客户端的Java库是Jersey。

11

如果你只是想获取数据,你能做到这一点Grails中这样说:

import grails.converters.*; 

def url = new URL("http://neotest.dabbledb.com/publish/neotest/f820728c-4451-41f6-b346-8cba54e52c6f/projects.jsonp") 
def response = JSON.parse(url.newReader()) // response is an instance of JSONObject (see Grails API docs) 

println response.toString(3) // Pretty-printed output 
response.each { key, value -> 
    println "$key = $value" 
} 

(只是作为一个简单的替代)

+0

小心!这个例子会泄漏阅读器(并依次java.net.HttpURLConnection和套接字!),并且它不会使用远程服务器指定的字符编码(而是使用您的平台的默认编码)。换句话说:在一般情况下,URL.newReader是不好的 – JesperSM 2012-06-05 09:37:33

0

,我们可以分析与JsonSlurper类JSON文本。我们只需将文本提供给parseText()方法,并且我们可以将这些值映射到地图和列表。并获得则内容很容易

def slurper = new JsonSlurper() 
def result = slurper.parseText('{"person":{"name":"Guillaume","age":33,"pets":["dog","cat"]}}') 

assert result.person.name == "Guillaume" 
assert result.person.age == 33 

assert result.person.pets.size() == 2 
assert result.person.pets[0] == "dog" 
assert result.person.pets[1] == "cat" 

or 

result.person.pets.each{ 
     println it 
}