Pour résoudre ce problème, j'ai adopté l'approche suivante (standardiser le processus dans mon application, rendre le code clair et réutilisable) :
- Créez une classe d'annotation à utiliser sur les champs que vous souhaitez exclure.
- Définir une classe qui implémente l'interface ExclusionStrategy de Google
- Créer une méthode simple pour générer l'objet GSON en utilisant le GsonBuilder (similaire à l'explication d'Arthur)
- Annoter les champs à exclure si nécessaire
- Appliquer les règles de sérialisation à votre objet com.google.gson.Gson
- Sérialiser votre objet
Voici le code :
1)
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface GsonExclude {
}
2)
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
public class GsonExclusionStrategy implements ExclusionStrategy{
private final Class<?> typeToExclude;
public GsonExclusionStrategy(Class<?> clazz){
this.typeToExclude = clazz;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return ( this.typeToExclude != null && this.typeToExclude == clazz )
|| clazz.getAnnotation(GsonExclude.class) != null;
}
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getAnnotation(GsonExclude.class) != null;
}
}
3)
static Gson createGsonFromBuilder( ExclusionStrategy exs ){
GsonBuilder gsonbuilder = new GsonBuilder();
gsonbuilder.setExclusionStrategies(exs);
return gsonbuilder.serializeNulls().create();
}
4)
public class MyObjectToBeSerialized implements Serializable{
private static final long serialVersionID = 123L;
Integer serializeThis;
String serializeThisToo;
Date optionalSerialize;
@GsonExclude
@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="refobj_id", insertable=false, updatable=false, nullable=false)
private MyObjectThatGetsCircular dontSerializeMe;
...GETTERS AND SETTERS...
}
5)
Dans le premier cas, null est fourni au constructeur, vous pouvez spécifier une autre classe à exclure - les deux options sont ajoutées ci-dessous
Gson gsonObj = createGsonFromBuilder( new GsonExclusionStrategy(null) );
Gson _gsonObj = createGsonFromBuilder( new GsonExclusionStrategy(Date.class) );
6)
MyObjectToBeSerialized _myobject = someMethodThatGetsMyObject();
String jsonRepresentation = gsonObj.toJson(_myobject);
ou, pour exclure l'objet Date
String jsonRepresentation = _gsonObj.toJson(_myobject);
0 votes
Vouliez-vous coller un code pour que nous puissions vous aider à résoudre votre problème ?
2 votes
La solution d'eugene basée sur les annotations est correcte, mais il n'y a pas besoin d'annotation supplémentaire et d'implémentation d'ExclusionStrategy dans ce cas. Il suffit d'utiliser Java ' transitoire pour cela. Cela fonctionne pour la sérialisation d'objets Java standard, mais aussi pour la sérialisation d'objets Gson le respecte .