在Groovy / Grails中的JSON

6
我试图通过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}"
        }
    }
}

然而,当我运行该方法的单元测试时,我只得到了ProjectController groovy.lang.MissingPropertyException: No such property: GET for class: ProjectController的错误提示,这让我很难理解。

5个回答

14

您的示例代码存在一些问题。首先,要以那种方式访问GET和JSON,您需要静态导入它们:

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

这样会使代码编译通过,但无法成功运行。你的url.path值需要一个前导'/'(如HTTPBuilder页面所示)。更重要的是,从你引用的URL返回的JSON与执行Google搜索的示例代码返回的JSON结构完全不同。如果将你的URL加载到非常方便的CuriousConcept的JSON Formatter服务中,您将看到该结构。以下是显示一些JSON数据的代码:
println json.name
println json.id
json.fields.each {
  println it
}

顺便提一下,HTTPBuilder 0.5.0版本中有一个重大变化与此代码相关。正如RC-1发布公告所述,
HTTPBuilder类的URL属性已更名为uri
因此,如果您在某个时候转移到0.5.0版本,则需要使用uri.path而不是url.path。

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"
}

(只是一个简单的替代方案)


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

0

我对HTTPBuilder不熟悉,但是根据文档,你可能可以通过替换来解决。

http.request( GET, JSON ) {

使用

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

你可能还需要:

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

我是基于HttpBuilder.request()的文档进行的,它要求一个方法和一个对象(可以是内容类型)。


我并不是非用HTTPBuilder不可,只是在Grails中进行JSON调用时,一些顶级的Google搜索结果建议使用它。如果您有其他推荐的解决方案,我完全支持,因为我在这里没有取得太多进展。 - Kivus
很多人推荐使用Apache的HttpClient,而HTTP Builder似乎是基于它的,所以这可能是最好的选择。我只是想帮助解决您Groovy脚本中出现的编译错误。如果HTTP Builder不起作用,您可以在Groovy中编写一些直接使用HttpClient的Java代码,甚至是java.net.*,尽管这需要更多的代码。 - Rob Hruska

0
我们可以使用JsonSlurper类解析JSON文本。我们只需要将文本传递给parseText()方法,然后我们就可以将值映射到Maps和Lists上。接下来获取内容非常简单。
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
 }

-3

虽然没有回答原问题,但我注意到你询问了其他可能的库。不考虑 Groovy(我没有用过它),在我看来,构建 Web 服务客户端最好、最简单的 Java 库是 Jersey,毫无疑问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接