2013-10-02 10 views
24

मेरे पास दो डोमेन क्लासेस हैं जो माता-पिता हैं और दूसरा बच्चा है और मेरे पास उनके बीच बहुत अधिक संबंध है। अभिभावक वर्ग में कई बच्चे हैं और बाल वर्ग मूल वर्ग से संबंधित है। और यहां कोडिंग उदाहरण है।Grails को बाल डोमेन ऑब्जेक्ट्स मिलते हैं

class Parent{ 
    String name 
    static hasMany = [childs:Child] 
    static constraints = { 
    } 
} 


class Child{ 
    String name 
    static belongsTo = [parent:Parent] 
    static constraints={} 
} 

समस्या जैसे ही मुझे मूल वस्तु मिलती है, मूल वर्ग से जुड़े बच्चे की वस्तुओं को भी प्राप्त किया जाता है। लेकिन जब मैं ऑब्जेक्ट को जेएसओएन में परिवर्तित करता हूं तो मुझे पूरी तरह से बच्चे की वस्तु नहीं दिखाई देती है, मैं केवल आईडी की बाल वस्तुओं को देख सकता हूं। मैं केवल आईडी के बजाय बाल ऑब्जेक्ट के सभी कॉलम देखना चाहता हूं।

परिवर्तित JSON उत्तर:

[{"class":"project.Parent","id":1, 
    "name":"name1","childs":[{"class":"Child","id":1},{"class":"Review","id":2}]}] 

लेकिन मैं प्रतिक्रिया जो भी बच्चे को वस्तु का नाम शामिल है चाहते हैं, के रूप में

[{"class":"project.Parent","id":1,"name":"name1", 
    "childs":[{"class":"Child","id":1,"name":"childname1"}, 
      {"class":"Review","id":2,"name":"childname2"} 
      ] 
}] 

कोई बहुत सराहना मदद इस प्रकार है। अग्रिम धन्यवाद।

उत्तर

48

समस्या डिफ़ॉल्ट JSON कनवर्टर के उपयोग के साथ है।

1. Default - all fields, shallow associations 
    a. render blah as JSON 

2. Global deep converter - change all JSON converters to use deep association traversal 
    a. grails.converters.json.default.deep = true 

3. Named config marshaller using provided or custom converters 
    a. JSON.createNamedConfig('deep'){ 
     it.registerObjectMarshaller(new DeepDomainClassMarshaller(...)) 
    } 
    b. JSON.use('deep'){ 
     render blah as JSON 
    } 

4. Custom Class specific closure marshaller 
    a. JSON.registerObjectMarshaller(MyClass){ return map of properties} 
    b. render myClassInstance as JSON 

5. Custom controller based closure to generate a map of properties 
    a. convert(object){ 
     return map of properties 
    } 
    b. render convert(blah) as JSON 

आप वर्तमान में विकल्प 1, जो डिफ़ॉल्ट है प्रयोग कर रहे हैं: यहाँ अपने विकल्प हैं।

वैश्विक गहरी कनवर्टर सेट करने के लिए आप सबसे आसान विकल्प 2 का उपयोग कर सकते हैं, लेकिन इस ऐप को अपने ऐप में सभी डोमेन क्लास को प्रभावित करें। जिसका अर्थ यह है कि यदि आपके पास शीर्ष स्तर की वस्तु में समापन संगठनों का एक बड़ा पेड़ है और आप उन शीर्ष स्तर की वस्तुओं की सूची को परिवर्तित करने का प्रयास करते हैं तो गहरी कनवर्टर सभी संबंधित वस्तुओं और उनके संबंधित ऑब्जेक्ट्स को लाने के लिए सभी प्रश्नों को निष्पादित करेगा। मोड़। - आप एक शॉट में एक संपूर्ण डेटाबेस लोड कर सकते हैं :) सावधान रहें।

+0

अरे धन्यवाद मैं 3 विधि JSON.use ('deap') का इस्तेमाल किया {JSON के रूप में प्रस्तुत करना जनक} यह बस के रूप में मैं उम्मीद काम किया। – user2823355

+0

आपको बहुत बहुत धन्यवाद! इससे कई समस्याएं हल हो जाएंगी <3 – Mephiztopheles

+0

आपका स्वागत है, खुश कोडिंग। – dbrin

1

उपयोगकर्ता डब्रिन सही है, लेकिन एक और विकल्प है। तुम भी Grails GSON प्लगइन इस्तेमाल कर सकते हैं:

https://github.com/robfletcher/grails-gson#readme

प्लगइन जब json डेटा के साथ काम कर कुछ और सुविधाएं शामिल हैं।

3

नवीनतम grails स्वचालित रूप से गहरी रूपांतरित हो जाता है लेकिन आप शायद आलसी लोडिंग का शिकार हो।

बच्चों को एक्सेस पर लोड नहीं किया जाता है और इसलिए JSON कनवर्टर उन्हें JSON में परिवर्तित नहीं कर सकता है। वैकल्पिक हल इस

स्थिर मानचित्रण = {बच्चे आलसी: झूठी} डाल करने के लिए है

संबंधित मुद्दे