2013-10-14 24 views
7

Ist es möglich benutzerdefinierte JSON Marshaller mit der tiefen Option von JSON zu verwenden?Verwenden benutzerdefinierter JSON Marshaller in Grails mit tiefer Option

Ich habe einige Dinge versucht und ohne die tiefe Option, meine benutzerdefinierten Marshaller funktionieren gut. Aber wenn ich JSON.use ('deep') hinzufüge, werden meine benutzerdefinierten Marshaller nie aufgerufen ...

Gibt es noch etwas, was ich tun muss?

Was ich bisher versucht habe (all das im Bootstrap und auch mit und ohne Priorität param (Werte 1 und 999999)). Ich habe auch versucht, den Aufruf von JSON.use ('deep') am Anfang und am Ende mit den gleichen Ergebnissen zu setzen.

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

Und auch versucht, die Option Config, hat aber keine Wirkung, die tiefe Umwandlung nicht ausgelöst wird ...

UPDATE: Ein Beispiel Eine Mission hat viele Erfolge und ich möchte eine Mission und ihre Erfolge

abrufen
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 

} 

Und dies ist ein Beispiel für die Einweiser ich

Schreiben wurde
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

Dies ergibt keinen Sinn. "Deep" ist eine Option des Marshallers, um geschachtelte Eigenschaften eines Objekts zu konvertieren. Wenn Sie die Conversions angeben, wie ist es sinnvoll, dies festzulegen? –

+0

Weil ich auch innere Objekte innerhalb meines Marshallers marshallieren möchte ... Ich weiß, dass ich das manuell tun kann (es ist, was ich gerade getan habe, um fortzufahren), aber ich fragte mich, ob es eine andere Möglichkeit gab – Eylen

+0

Bieten ein Beispiel –

Antwort

6

Damit werden die Leistungen mit der Mission machen. Beantwortet das deine Frage?

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

Ich denke, ich hatte das vorher und arbeitete jetzt, dass ich es sehe. Die Wahrheit ist, dass ich nicht JSON, insteand verwende ich I18nJSON, das ist eine Klasse, die von JSON erweitert und fügt einen Sprachparameter bei Bedarf ... Also ich denke, dass mein Problem von dieser Erweiterung stammt ... Dies ist die richtige Antwort für einen normalen Fall, also werde ich es akzeptieren, da ich auch einen Workaround gefunden habe ... Danke – Eylen