Um dieses Problem anzugehen, habe ich den folgenden Ansatz gewählt (Standardisierung des Prozesses in meiner Anwendung, Klarheit und Wiederverwendbarkeit des Codes):
- Erstellen Sie eine Anmerkungsklasse, die für Felder verwendet werden soll, die ausgeschlossen werden sollen
- Definieren Sie eine Klasse, die die ExclusionStrategy-Oberfläche von Google implementiert
- Erstellen Sie eine einfache Methode zum Generieren des GSON-Objekts mit dem GsonBuilder (ähnlich wie bei Arthur).
- Kommentieren Sie die Felder, die nach Bedarf ausgeschlossen werden sollen
- Wenden Sie die Serialisierungsregeln auf Ihr com.google.gson.Gson-Objekt an
- Serialisieren Sie Ihr Objekt
Hier ist der 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)
Im ersten Fall wird dem Konstruktor null übergeben. Sie können eine andere Klasse angeben, die ausgeschlossen werden soll. Beide Optionen werden unten hinzugefügt
Gson gsonObj = createGsonFromBuilder( new GsonExclusionStrategy(null) );
Gson _gsonObj = createGsonFromBuilder( new GsonExclusionStrategy(Date.class) );
6)
MyObjectToBeSerialized _myobject = someMethodThatGetsMyObject();
String jsonRepresentation = gsonObj.toJson(_myobject);
oder, um das Date-Objekt auszuschließen
String jsonRepresentation = _gsonObj.toJson(_myobject);