2013-05-25 5 views
5

आज इस अजीब परिणाम में आया कि ऑब्जेक्ट्स की एक सूची को Grails 2.0.4 में JSON के रूप में प्रस्तुत करने का प्रयास कर रहा है ... (मुझे पता है कि मुझे अफसोस है यह मेरी नाक के ठीक नीचे कुछ के कारण ... अद्यतन 5/26, मेरी भविष्यवाणी सही थी, नीचे देखें :-))सशर्त ऑपरेटर के साथ Grails में 'JSON के रूप में प्रस्तुत करना सही ढंग से प्रस्तुत नहीं करता है

यह ठीक काम करता है; JSON ब्राउज़र में सही ढंग से renders ...

def products = [] //ArrayList of Product objects from service  
def model = (products) ? [products:products] : [products:"No products found"] 
render model as JSON 

..so क्यों नहीं देता है model काम के बिना इस छोटे स्वरूप?

def products = []  
render ((products) ? [products:products] : [products:"No products found"]) as JSON 

ऊपर कोड से उत्पन्न JSON टेक्स्ट की एक पंक्ति के रूप में उत्पादन होता है, तो मैं इसे as JSON उठा नहीं कर रहा है पर शक है, लेकिन इसे सही ढंग से parenthesized है, तो क्या सौदा है?

[ 'उत्पाद': [com.test.domain.Product: अशक्त, com.test.domain.Product ...]

उत्तर

8

यह render की एक सामान्य व्यवहार है। जब आप की तरह

render model as JSON

ब्रेसिज़ बिना render लिए तर्क देते हैं यह एक अंतर्निहित समायोजन text/json को content-type की स्थापना करता है। लेकिन बाद में मामले में, आप अनजाने में render बना दिया है [के बाद render बनाता उपयोग सामान्य render() प्रस्तुत करना पहला ब्रेस पर निशान]

render ((products) ? [products:products] : [products:"No products found"]) as JSON तरह ब्रेसिज़ उपयोग करने के लिए।

ऊपर मामले में, आप उल्लेख render करने के लिए नामित मानकों में पारित करने के लिए है contentType, text या model, status आदि तो आदेश ब्राउज़र में JSON के रूप में इनलाइन नियंत्रण तर्क प्रस्तुत करने के लिए इन/देखने आप की तरह क्या करना है नीचे:

render(contentType: "application/json", text: [products: (products ?: "No products found")] as JSON) 

तुम भी text/json रूप content-type उपयोग कर सकते हैं। मैं application/json पसंद करता हूं।

अद्यतन
वैकल्पिक सबसे आसान तरीका:
render([products: (products ?: "No products found")] as JSON)

+0

Damnit, मैं 'लागू कर रहा हूँ प्रस्तुत करना() कहने के लिए' भी अनजाने, THX, मैं अपने समाधान के इस तत्वों का उपयोग कर के साथ जा रहा समाप्त हो गया है, यह एक है थोड़ा छोटा और सामग्री प्रकार दो बार निर्दिष्ट करने से बचा जाता है: 'प्रस्तुत करना (contentType:" text/json ") उत्पादों' प्रस्तुत करना ((: {[उत्पादों: (उत्पादों: "कोई भी उत्पाद नहीं मिला")]} ' – raffian

+4

यह रूप में अच्छी तरह काम करेगा ? [उत्पादों: उत्पादों]: [उत्पादों: "कोई उत्पादों पाया"]) JSON के रूप में) 'छेद, अच्छा .. में –

+0

@JamesKleeh ऐस और मैं वास्तव में क्या देख रहा था! – raffian

1

कारण पता नहीं है। इस तरह का उपयोग करने का प्रयास करें:

render(contentType: 'text/json') {[ 
    'products': products ? : "No products found" 
]} 
1

क्या करते हैं आप में मानकों() के साथ प्रस्तुत करना बुला रहा है, और फिर लागू करने "JSON के रूप में" परिणाम के लिए!

यह न भूलें कि कोष्ठक छोड़कर विधि कॉल के लिए केवल एक शॉर्टकट है, लेकिन वही नियम अभी भी लागू होते हैं।

3

आपकी समस्या का सार है कि यहाँ ग्रूवी संकलक की व्याख्या

render x as JSON 

मतलब

render (x as JSON) 

है लेकिन यह

render (x) as JSON 

मतलब करने के लिए व्याख्या

(render x) as JSON 

एक विधि नाम (इस मामले render में) तुरंत एक आरंभिक कोष्ठक द्वारा पीछा किया जाता है, तो केवल मिलान कोष्ठक बंद करने के लिए ऊपर कोड तर्क सूची माना जाता है। यह वह जगह है तुम क्यों कोष्ठकों का एक अतिरिक्त सेट की जरूरत है

render ((x) as JSON) 
संबंधित मुद्दे