2009-08-24 13 views
6

मैं अपने JSON निर्यात के माध्यम से किसी साइट तक पहुंचने का प्रयास कर रहा हूं।ग्रोवी/ग्रेइल्स में JSON

यूआरएल है: http://neotest.dabbledb.com/publish/neotest/f820728c-4451-41f6-b346-8cba54e52c6f/projects.jsonp

मैं HTTPBuilder उपयोग कर रहा हूँ कोशिश करते हैं और ग्रूवी में यह पूरा करने के लिए, लेकिन परेशानी हो रही हूँ। मैं इस के साथ आने के लिए 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

आपके नमूना कोड के साथ कुछ समस्याएं हैं। सबसे पहले, प्राप्त और JSON कि जिस तरह से, आप स्थिर उन्हें आयात करने की आवश्यकता तक पहुँचने के लिए:

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

कि कोड संकलन कर देगा, लेकिन सफलतापूर्वक नहीं चला। आपके url.path मान को अग्रणी '/' की आवश्यकता है (जैसा कि HTTPBuilder page पर दिखाया गया है)। सबसे महत्वपूर्ण बात यह है कि JSON जो the URL you're referencing से वापस आता है, उसमें से एक पूरी तरह से अलग संरचना है जो 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 में एक को तोड़ने परिवर्तन यह है कि इस कोड के लिए प्रासंगिक है। आर सी -1 रिहाई घोषणा राज्यों के रूप में,

HTTPBuilder वर्ग 'यूआरएल संपत्ति

उरी के लिए इसलिए, यदि आप कुछ बिंदु पर 0.5.0 करने के लिए ले जाते हैं, आप की आवश्यकता होगी नाम दिया गया है 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() के लिए प्रलेखन के इसे बंद कर रहा हूं, जो 01 के लिए कॉल करता हैऔर एक ऑब्जेक्ट (जो ContentType हो सकता है)।

+0

मैं किसी भी खिंचाव से HTTPBuilder को शादी-शुदा नहीं कर रहा हूँ है, यह सिर्फ JSON के लिए Grails से कॉल क्या शीर्ष गूगल प्रविष्टियों में से कुछ सुझाव दिया था। यदि कोई अन्य समाधान है जो आप अनुशंसा करेंगे, तो मैं इसके लिए सब कुछ कर रहा हूं, क्योंकि मैं यहां बहुत प्रगति नहीं कर रहा हूं। – Kivus

+0

बहुत से लोग अपाचे के एचटीपी क्लाइंट की सलाह देते हैं, जो HTTP बिल्डर पर आधारित प्रतीत होता है, इसलिए यह शायद सबसे अच्छा विकल्प है। मैं बस अपनी ग्रोवी लिपि में एक संकलन त्रुटि के रूप में दिखाई देने में मदद करने की कोशिश कर रहा था। यदि HTTP बिल्डर काम नहीं करता है, तो आप अपने ग्रोवी में कुछ सीधे जावा लिख ​​सकते हैं जो HttpClient, या यहां तक ​​कि java.net का उपयोग करता है। *, हालांकि यह थोड़ा और कोड होगा। –

-3

के बजाय uri.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" 
} 

(सिर्फ एक सरल विकल्प के रूप में)

+0

यहां पर सावधान रहें! यह उदाहरण पाठक को रिसाव करेगा (और बदले में java.net.HttpURLConnection और उसके साथ, सॉकेट!), और यह दूरस्थ सर्वर द्वारा निर्दिष्ट वर्ण एन्कोडिंग का उपयोग नहीं करेगा (इसके बजाय यह आपके प्लेटफ़ॉर्म के डिफ़ॉल्ट एन्कोडिंग का उपयोग करेगा)। दूसरे शब्दों में: URL.newReader सामान्य मामले में बीएडी है – JesperSM

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 
}