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
abrufenclass 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 wurdeclass 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()
}
}
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? –
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
Bieten ein Beispiel –