2009-08-24 67 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 
}