2013-10-14 16 views
7

È possibile utilizzare i marshaller JSON personalizzati utilizzando l'opzione deep di JSON?Utilizzo del marshaller JSON personalizzato in Grails con opzione deep

Ho provato alcune cose e senza l'opzione profonda, i miei marshaller personalizzati funzionano correttamente. Ma quando aggiungo JSON.use ('deep') i miei marshaller personalizzati non vengono mai chiamati ...

C'è qualcos'altro che devo fare?

Ciò che ho provato fino ad ora (tutto questo in Bootstrap e anche con e senza param di priorità (valori 1 e 999999)). Inoltre ho provato a mettere la chiamata JSON.use ('deep') all'inizio e alla fine con gli stessi risultati.

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

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

E anche provato l'opzione di configurazione, ma non ha effetto, la conversione profonda non viene attivato ...

UPDATE: An esempio Una missione ha molti risultati e voglio recuperare una missione e i suoi risultati

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 

} 

E questo è un esempio del marshaller stavo scrivendo

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

Questo non ha senso. "Deep" è un'opzione del marshaller per dirgli di convertire le proprietà annidate di un oggetto. Se stai specificando le conversioni, come ha senso impostarlo? –

+0

Perché voglio anche mettere gli oggetti interni all'interno del mio marshaller ... So che posso farlo manualmente (è quello che ho appena fatto per continuare) ma mi chiedevo se esistesse un'altra opzione – Eylen

+0

Fornire un esempio –

risposta

6

Questo renderà i risultati con la missione. Questo risponde alla tua domanda?

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

Penso di averlo già fatto prima e ho lavorato ora che lo vedo. La verità è che non sto usando JSON, sto usando I18nJSON che è una classe che si estende da JSON e aggiunge un parametro di linguaggio quando necessario ... Quindi immagino che il mio problema provenga da questa estensione ... Questa è la risposta corretta per un caso normale, quindi accetterò come ho anche trovato una soluzione ... Grazie – Eylen