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 { ObjectId id String name boolean active = true List<AchievementBase> achievements = [] static hasMany = [achievements:AchievementBasen] } class AchievementBase { ObjectId id String name boolean active = true 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() } }