2013-10-14 7 views
7

के साथ Grails में कस्टम JSON marshaller का उपयोग करना JSON के गहरे विकल्प का उपयोग कर कस्टम JSON marshallers का उपयोग करना संभव है?गहरे विकल्प

मैं कुछ चीजों की कोशिश कर रहा हूं और गहरे विकल्प के बिना, मेरे कस्टम मार्शलर ठीक काम कर रहे हैं। लेकिन जब मैं JSON.use ('deep') जोड़ता हूं तो मेरे कस्टम मार्शलर्स को कभी नहीं कहा जाता है ...

क्या मुझे कुछ और करने की ज़रूरत है?

मैंने अब तक क्या प्रयास किया है (यह बूटस्ट्रैप में और साथ ही प्राथमिकता के बिना और बिना पैरामीटर (मूल्य 1 और 99 99 99))। इसके अलावा मैंने शुरुआत में JSON.use ('deep') कॉल और उसी परिणाम के साथ अंत को डालने का प्रयास किया है।

विकल्प 1

JSON.use("deep") { 
    JSON.registerObjectMarshaller(new UserMarshaller(),999999) 
    JSON.registerObjectMarshaller(new TeamMarshaller(),999999) 
    JSON.registerObjectMarshaller(new LevelMarshaller(),999999) 
    JSON.registerObjectMarshaller(new BehaviourMarshaller(),999999) 
    JSON.registerObjectMarshaller(new AchievementMarshaller(),999999) 
    JSON.registerObjectMarshaller(new PercentageAchievementMarshaller(),999999) 
    JSON.registerObjectMarshaller(new IntervalMarshaller(),999999) 
    JSON.registerObjectMarshaller(new MissionMarshaller(),999999) 
    JSON.registerObjectMarshaller(new ActivityMarshaller(),999999) 
    JSON.registerObjectMarshaller(new RecentActivityMarshaller(),999999) 
    JSON.registerObjectMarshaller(new ProfileMarshaller(),999999) 
    JSON.registerObjectMarshaller(new StatusMarshaller(),999999) 
    JSON.registerObjectMarshaller(ObjectId){ObjectId oid-> 
     return oid.toString() 
    } 
} 

JSON.use('deep') 

विकल्प 2

JSON.registerObjectMarshaller(new UserMarshaller(),999999) 
JSON.registerObjectMarshaller(new TeamMarshaller(),999999) 
JSON.registerObjectMarshaller(new LevelMarshaller(),999999) 
JSON.registerObjectMarshaller(new BehaviourMarshaller(),999999) 
JSON.registerObjectMarshaller(new AchievementMarshaller(),999999) 
JSON.registerObjectMarshaller(new PercentageAchievementMarshaller(),999999) 
JSON.registerObjectMarshaller(new IntervalMarshaller(),999999) 
JSON.registerObjectMarshaller(new MissionMarshaller(),999999) 
JSON.registerObjectMarshaller(new ActivityMarshaller(),999999) 
JSON.registerObjectMarshaller(new RecentActivityMarshaller(),999999) 
JSON.registerObjectMarshaller(new ProfileMarshaller(),999999) 
JSON.registerObjectMarshaller(new StatusMarshaller(),999999) 
JSON.registerObjectMarshaller(ObjectId){ObjectId oid-> 
    return oid.toString() 
} 

    JSON.use('deep') 

और यह भी कॉन्फ़िग विकल्प कोशिश की, लेकिन कोई प्रभाव नहीं है, गहरी रूपांतरण ट्रिगर नहीं है ...

अद्यतन: एक उदाहरण एक मिशन में कई उपलब्धियां हैं और मैं एक मिशन और इसकी उपलब्धियों को पुनर्प्राप्त करना चाहता हूं

class Mission { 

    /** Identificador */ 
    ObjectId id 
    /** Nombre */ 
    String name 
    /** Indica si la misión está o no activa */ 
    boolean active = true 

    List<AchievementBase> achievements = [] 

    static hasMany = [achievements:AchievementBasen] 
} 

class AchievementBase { 
    /** Identificador */ 
    ObjectId id 
    /** Nombre del logro */ 
    String name 
    /** Valor booleano para indicar si el logro está o no activo */ 
    boolean active = true 
    /** Valor booleano para indicar si el logro está o no visible */ 
    boolean hidden = false 

} 

और यह marshaller का एक उदाहरण मैं

class MissionMarshaller implements ObjectMarshaller<JSON>{ 
    @Override 
    public boolean supports(Object object) { 
     object instanceof Mission 
    } 

    @Override 
    public void marshalObject(Object object, JSON converter) 
      throws ConverterException { 
     JSONWriter writer = converter.getWriter() 
     writer.object() 
     writer.key('id').value(object.id) 
     .key("name").value(object.name) 
     .key('achievements').value(object.achievements) 
     writer.endObject() 
    } 

} 

class AchievementMarshaller implements ObjectMarshaller<JSON>{ 

    @Override 
    public boolean supports(Object object) { 
     object instanceof Achievement 
    } 

    @Override 
    public void marshalObject(Object object, JSON converter) 
      throws ConverterException { 
     JSONWriter writer = converter.getWriter() 
     writer.object() 
     writer.key('id').value(object.id) 
      .key("name").value(object.name) 
     writer.endObject() 
    } 

} 
+0

यह समझ में नहीं आता है। "दीप" एक वस्तु के नेस्टेड गुणों को परिवर्तित करने के लिए यह कहने के लिए मार्शलर का एक विकल्प है। यदि आप रूपांतरण निर्दिष्ट कर रहे हैं, तो इसे सेट करने के लिए यह कैसे समझ में आता है? –

+0

क्योंकि मैं अपने मार्शलर के अंदर भीतरी वस्तुओं को मार्शल करना चाहता हूं ... मुझे पता है कि मैं इसे मैन्युअल रूप से कर सकता हूं (यह मैंने अभी जारी रखने के लिए किया है) लेकिन मैं सोच रहा था कि यह एक और विकल्प मौजूद है – Eylen

+0

उदाहरण प्रदान करें –

उत्तर

6

यह लिख रहा था मिशन के साथ उपलब्धियों प्रस्तुत करना होगा। क्या इससे आपके सवाल का जवाब मिलता है?

JSON.registerObjectMarshaller(Mission) { 
     def returnSet = [:] 
     returnSet.id = it.id 
     returnSet.name = it.name 
     returnSet.active = it.active 
     returnSet.achievements = it.achievements 
     return returnSet 
    } 

    JSON.registerObjectMarshaller(AchievementBase) { 
     def returnSet = [:] 
     returnSet.id = it.id 
     returnSet.name = it.name 
     returnSet.active = it.active 
     returnSet.hidden = it.hidden 
     return returnSet 
    } 
+0

जोड़ा है, मुझे लगता है कि मेरे पास पहले यह था और अब मैं काम करता हूं। सच्चाई यह है कि मैं JSON का उपयोग नहीं कर रहा हूं, उदाहरण के लिए मैं I18nJSON का उपयोग कर रहा हूं कि जेएसओएन से विस्तारित एक वर्ग एक आवश्यक होने पर भाषा पैरामीटर जोड़ता है ... तो मुझे लगता है कि मेरी समस्या इस एक्सटेंशन से आई है ... यह सामान्य मामले के लिए सही उत्तर है, इसलिए मैं इसे स्वीकार करूंगा क्योंकि मुझे एक वर्कअराउंड भी मिला है ... धन्यवाद – Eylen

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