JSON в Groovy / Граальс - PullRequest
       14

JSON в Groovy / Граальс

6 голосов
/ 24 августа 2009

Я пытаюсь получить доступ к сайту через экспорт JSON.

URL-адрес: 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, что у меня возникают проблемы с пониманием.

Ответы [ 5 ]

14 голосов
/ 25 августа 2009

Есть несколько проблем с вашим примером кода. Прежде всего, чтобы получить доступ к GET и JSON таким образом, вам необходимо статически импортировать их:

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

Это заставит код скомпилироваться, но не будет успешно запущен. Вашему значению url.path требуется начальный символ '/' (как показано на странице HTTPBuilder ). Что еще более важно, JSON, который возвращается с URL-адреса, на который вы ссылаетесь , имеет совершенно другую структуру, чем та, которую возвращает пример кода, который выполняет поиск Google. Если вы загрузите свой URL в очень удобный сервис JSON Formatter на CuriousConcept , вы увидите структуру. Вот код, который будет отображать некоторые данные JSON:

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

Кстати, в версии 0.5.0 HTTPBuilder есть существенное изменение, относящееся к этому коду. Как говорится в сообщении о выпуске RC-1,

Свойство URL класса HTTPBuilder переименовано в uri

Итак, если вы перейдете на 0.5.0 в какой-то момент, вам нужно будет использовать uri.path вместо url.path

11 голосов
/ 25 августа 2009

Если вы просто хотите получить данные, вы можете сделать это в 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 голосов
/ 17 июня 2013

мы можем проанализировать текст JSON с помощью класса JsonSlurper. Нам нужно только передать текст в метод 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
 }
0 голосов
/ 25 августа 2009

Хотя не отвечая на оригинальный вопрос, я заметил, что вы спрашивали о других возможных библиотеках. Не обращая внимания на Groovy, который я не использовал для этого, лучшей и самой простой библиотекой Java для создания клиента веб-сервисов, на мой взгляд, является Джерси, руки вниз.

0 голосов
/ 24 августа 2009

Я не знаком с HTTPBuilder, но, глядя на документацию, вы можете обойтись заменой

http.request( GET, JSON ) {

с

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

Вам также может понадобиться:

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

Я основываюсь на документации HttpBuilder.request () , которая требует Метод и Объект (который может быть ContentType ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...