2011-06-27 16 views
12

क्या JSON कनवर्टर में कक्षा फ़ील्ड को निकालने का कोई तरीका है?Grails - grails.converters.JSON - कक्षा का नाम हटाकर

उदाहरण:

import testproject.* 
import grails.converters.* 
emp = new Employee() 
emp.lastName = "Bar" 
emp as JSON 

के रूप में एक स्ट्रिंग

{"class":"testproject.Employee","id":null,"lastName":"Bar"} 

है मैं पसंद करेंगे

{"id":null,"lastName":"Bar"} 

वहाँ के अंत में कोड की एक और पंक्ति जोड़ने के लिए एक रास्ता है कक्षा क्षेत्र को हटा दें?

+0

चेक यह अन्य जवाब http://stackoverflow.com/questions/5538423/grails-jsonbuilder/5540471#5540471 – Maricel

उत्तर

12

यहां ऐसा करने का एक तरीका है। मैं डोमेन वर्ग के लिए एक अगली कोड जोड़ दिया है:

:

static { 
    grails.converters.JSON.registerObjectMarshaller(Employee) { 
    return it.properties.findAll {k,v -> k != 'class'} 
    } 
} 

लेकिन जब आप भी 'क्लास' शामिल नहीं पैरामीटर के लिए, उदाहरण के लिए जोड़ना होगा के रूप में मैं अगर आप का इस्तेमाल किया है ग्रूवी @ToString वर्ग एनोटेशन पाया

@ToString(includeNames = true, includeFields = true, excludes = "metaClass,class") 
3

एक वैकल्पिक निर्माता का उपयोग नहीं करने के लिए है:

def myAction = { 
    def emp = new Employee() 
    emp.lastName = 'Bar' 

    render(contentType: 'text/json') { 
     id = emp.id 
     lastName = emp.lastName 
    } 
} 

इसमें कुछ समय कम ओर्थोगोनल, क्योंकि आप अपने प्रतिपादन बदलने की जरूरत होता है कर्मचारी परिवर्तन करता है, तो; दूसरी तरफ, आपके द्वारा प्रदान किए जाने वाले कार्यों पर अधिक नियंत्रण होता है।

1
import testproject.* 
import grails.converters.* 
import grails.web.JSONBuilder 

def emp = new Employee() 
emp.lastName = "Bar" 

def excludedProperties = ['class', 'metaClass'] 

def builder = new JSONBuilder.build { 
    emp.properties.each {propName, propValue -> 

    if (!(propName in excludedProperties)) { 
    setProperty(propName, propValue) 
    } 
} 

render(contentType: 'text/json', text: builder.toString()) 
7

ऐसा करने का मेरा पसंदीदा तरीका:

def getAllBooks() { 
    def result = Book.getAllBooks().collect { 
     [ 
      title: it.title, 
      author: it.author.firstname + " " + it.author.lastname, 
      pages: it.pageCount, 
     ] 
    } 
    render(contentType: 'text/json', text: result as JSON) 
} 

यह() Book.getAllBoks से सभी वस्तुओं लेकिन कलेक्ट विधि सभी प्रारूप आपके द्वारा निर्दिष्ट में बदल जाएगा वापस आ जाएगी।

1

@ वावरलॉक का जवाब आंशिक रूप से सही है, मुझे रजिस्टर ऑब्जेक्ट मार्शलर बूटस्ट्रैप पर रखना है, यह काम कर सकता है।

1
def a = Employee.list() 

String[] excludedProperties=['class', 'metaClass'] 
render(contentType: "text/json") { 
    employees = array { 
     a.each { 
      employee it.properties.findAll { k,v -> !(k in excludedProperties) } 
     } 
    } 
} 

यह मेरे लिए काम करता है। आप बाहर निकलने के लिए किसी भी संपत्ति में आसानी से पास कर सकते हैं। या इसे चारों ओर घुमाएं:

def a = Employee.list() 

String[] includedProperties=['id', 'lastName'] 
render(contentType: "text/json") { 
    employees = array { 
     a.each { 
      employee it.properties.findAll { k,v -> (k in includedProperties) } 
     } 
    } 
} 

सावधान रहें: यह केवल साधारण वस्तुओं के लिए है। यदि आप "गलत स्थान: कुंजी की अपेक्षित मोड देखते हैं लेकिन ऑब्जेक्ट था" यह समाधान आपके लिए नहीं है। :)

हिमाचल प्रदेश

+0

आवेदन/json सही सामग्री प्रकार होना चाहिए –

1

आप (वर्ग के नाम सहित) क्षेत्रों बाहर रखा जाना अनुकूलित grails.converters.JSON

def converter = emp as JSON 
converter.setExcludes(Employee.class, ["class",""]) 

और उसके बाद में प्रदान की setExcludes विधि का उपयोग कर सकते हैं, आप उपयोग कर सकते हैं यह सिर्फ अपनी आवश्यकताओं के अनुसार चाहते,

println converter.toString() 
converter.render(new java.io.FileWriter("/path/to/my/file.xml")) 
converter.render(response)