Using Custom JSON Marshaller in Grails with Deep Selection

Is it possible to use custom JSON marshalers using the deep JSON option?

I tried something and without a deep option, my custom marshalers work fine. But when I add JSON.use ("deep"), my custom marshalers are never called ...

Is there anything else I need to do?

What I have tried so far (all this in Bootstrap, as well as with and without a priority parameter (values ​​1 and 999999)). I also tried to put a JSON.use ("deep") call at the beginning and end with the same results.

OPTION 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') 

OPTION 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') 

And also tried the Config parameter, but has no effect, deep conversion does not start ...

UPDATE: example One mission has many achievements, and I want to get the mission and its achievements.

 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 } 

And this is one example of a marshaller I wrote

 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() } } 
+7
json grails deep
source share
1 answer

This will ensure the achievement of the mission. Does this answer your question?

  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 } 
+6
source share

All Articles