2013-02-22 41 views
5

पर Grails गणना, जेएसओएन के लिए enums तरीके से बदलना चाहते हैं। मैं वर्तमान में (JSON के रूप में) डिफ़ॉल्ट grails.converters.JSON उपयोग कर रहा हूँ और नियंत्रक में उदाहरण के लिए मैं का उपयोग करें:()जेएसओएन

FilmKind.values ​​JSON

रूप

इस के उत्पादन में है:

"kind":[{"enumType":"FilmKind","name":"DRAMA"},{"enumType":"FilmKind","name":"ACTION"}] 

मैं "enumType" दूर करने के लिए और बस वापसी करना चाहते हैं:

"kind":["DRAMA","ACTION"] 

मैं कर रहा हूँ एक समाधान है जो अभी भी मेरे JSON

रूप

उपयोग करने के लिए है क्योंकि मैं मार्शल करने के लिए प्रत्येक गणना अलग-अलग नहीं करना चाहते हैं की अनुमति होगी की तलाश में।

उत्तर

10

क्योंकि मैं मार्शल करने के लिए प्रत्येक गणना अलग-अलग नहीं करना चाहती।

ठीक है, जब तक कि आप अपना स्वयं का JSON कनवर्टर लिखना नहीं चाहते हैं, मार्शलिंग यहां सबसे अच्छा तरीका है। कारण यह है कि सर्जियो का सुझाव देने वाला एकमात्र असली तरीका यह है कि आपको उस कोड को हर जगह कॉल करना होगा, आपको इसकी आवश्यकता है। और यदि फिल्मकिंड किसी अन्य वर्ग की संपत्ति है तो उसका समाधान वास्तव में काम नहीं करेगा।

मैं मार्शलर्स का सुझाव दूंगा और यहां मैं यह कैसे करूंगा। एक वर्ग FilmKindMarsaller बुलाया बनाएँ:

class FilmKindMarshaller { 
    void register() { 
    JSON.registerObjectMarshaller(FilmKind) { FilmKind filmKind -> 
     [ 
      name: filmKind.toString() 

     ] 
    } 
    } 
} 

फिर अपने बूटस्ट्रैप के लिए निम्नलिखित जोड़ें:

[ new FilmKindMarshaller() ].each { it.register() } 

ऊपर इतना है कि आप बस प्रत्येक Marshaller आप की जरूरत के उदाहरणों को जोड़कर रख सकते हैं।

अब, कभी भी फिल्मकिंड JSON'ified है, चाहे वह अपने आप या माता-पिता वर्ग के हिस्से पर हो, आपको जेएसओएन मिलना चाहिए, sans enumType।

1

कैसे के बारे में:

def display = [kind:[]] 
FilmKind.values().each { val -> 
    display.kind.add(val.value) 
} 

render display as JSON 
+0

जवाब के लिए धन्यवाद! यह अच्छा है, मुझे इसे val.name के बजाय थोड़ा सा समायोजित करना पड़ा, val.value का उपयोग किया जाना चाहिए। लेकिन फिर भी मैं एक समाधान चाहता हूं जो इसे निम्न स्तर पर करता है, इसलिए मुझे इसे हर जगह लिखना नहीं है। इसके अलावा समस्या यह है कि जब मैं किसी डोमेन ऑब्जेक्ट पर 'JSON' करता हूं जिसमें enum प्रकार की संपत्ति होती है, तो enum मान निर्दिष्ट किया जाता है जिसे अभी भी 'enumType' के साथ भेजा जाता है। – MBozic

+0

निचले स्तर के लिए Gregg के जवाब की जांच करें। –

2

आप as JSON अनुमति देने के लिए अपने डोमेन के वर्ग के लिए एक कस्टम वस्तु marshaller रजिस्टर कर सकते हैं। अपने Bootstrap.groovy में, आप कुछ इस तरह कर सकते हैं:

JSON.registerObjectMarshaller(FilmKind) { 
    def result = [:] 
    def props = ['name'] 
    props.each { prop -> 
     result[prop] = it."$prop" 
    } 
    result 
} 
13

मामले किसी में कैसे एक सामान्य तरीके सादे स्ट्रिंग मान के लिए सभी enum मूल्यों कन्वर्ट करने के लिए भटक जाता है:

class EnumTypeHidingJSONMarshaller { 
    void register() { 
     JSON.registerObjectMarshaller(Enum) { Enum someEnum -> 
      someEnum.toString() 
     } 
    } 
} 
+5

या छोटा: JSON.registerObjectMarshaller (Enum, {Enum e -> e।नाम()}) –

+0

क्या यह Grails3 के लिए काम करता है? – bitsnaps