2013-10-14 2 views
7

Возможно ли использовать пользовательские маршаллы JSON, используя глубокую опцию JSON?Использование пользовательского маршаллера JSON в Grails с глубокой опцией

Я пробовал кое-что и без глубокого варианта, мои пользовательские маршаллеры работают нормально. Но когда я добавляю JSON.use («глубоко»), мои пользовательские маршаллеры никогда не называются ...

Есть ли что-то еще, что мне нужно сделать?

То, что я пробовал до сих пор (все это в Bootstrap, а также с и без приоритета param (значения 1 и 999999)). Также я попытался поместить вызов JSON.use («глубокий») в начале и в конце с теми же результатами.

ВАРИАНТ 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') 

ВАРИАНТ 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') 

А также попробовал вариант Config, но не имеет никакого эффекта, глубокое преобразование не срабатывает ...

UPDATE: пример Одна миссия имеет много достижений, и я хочу получить миссию и ее достижения

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 

} 

И это один пример ИАС я писал

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

} 
+0

Это не имеет смысла. «Глубокий» - это опция маршаллера, чтобы сообщить ему преобразовать вложенные свойства объекта. Если вы указываете конверсии, как это имеет смысл установить это? –

+0

Потому что я хочу также маршировать внутренние объекты внутри моего маршаллера ... Я знаю, что могу сделать это вручную (это то, что я только что сделал, чтобы продолжить), но мне было интересно, существует ли у него еще один вариант – Eylen

+0

Приведите пример –

ответ

6

Это сделает достижения с миссией. Отвечает ли это на ваш вопрос?

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 
    } 
+0

Я думаю, что у меня было это раньше и теперь работало, что я его вижу. По правде говоря, я не использую JSON, insteand Я использую I18nJSON, это класс, который простирается от JSON, при необходимости добавляет параметр языка ... Поэтому я предполагаю, что моя проблема возникла из этого расширения ... Это правильный ответ для нормального случая, поэтому я соглашусь с ним, так как я нашел обходное решение ... Спасибо – Eylen

Смежные вопросы