Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grails - grails.converters.JSON - removing the class name

Is there a way to remove the class field in a JSON converter?

Example:

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

as a string is

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

I'd prefer

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

Is there a way to add one more line of code at the end to remove the class field?

like image 971
BuddyJoe Avatar asked Jun 27 '11 16:06

BuddyJoe


2 Answers

Here is yet one way to do it. I've added a next code to the domain class:

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

But as I found if you have used Groovy @ToString class annotation when you also must add 'class' to excludes parameter, e.g.:

@ToString(includeNames = true, includeFields = true, excludes = "metaClass,class")
like image 183
wwarlock Avatar answered Oct 10 '22 04:10

wwarlock


My preferred way of doing this:

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)
}

This will return all the objects from Book.getAllBoks() but the collect method will change ALL into the format you specify.

like image 31
klogd Avatar answered Oct 10 '22 04:10

klogd