Để giải quyết vấn đề này, tôi đã thực hiện cách tiếp cận sau (chuẩn hóa quy trình trên ứng dụng của tôi, làm cho mã rõ ràng và có thể sử dụng lại):
- Tạo một lớp chú thích để được sử dụng trên các trường bạn muốn loại trừ
- Xác định một lớp triển khai giao diện ExclusiveStrategy của Google
- Tạo một phương thức đơn giản để tạo đối tượng GSON bằng GsonBuilder (tương tự như giải thích của Arthur)
- Chú thích các trường cần loại trừ khi cần
- Áp dụng các quy tắc tuần tự hóa cho đối tượng com.google.gson.Gson của bạn
- Tuần tự hóa đối tượng của bạn
Đây là mã:
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)
Trong trường hợp đầu tiên, null được cung cấp cho hàm tạo, bạn có thể chỉ định một lớp khác bị loại trừ - cả hai tùy chọn đều được thêm vào bên dưới
Gson gsonObj = createGsonFromBuilder( new GsonExclusionStrategy(null) );
Gson _gsonObj = createGsonFromBuilder( new GsonExclusionStrategy(Date.class) );
6)
MyObjectToBeSerialized _myobject = someMethodThatGetsMyObject();
String jsonRepresentation = gsonObj.toJson(_myobject);
hoặc, để loại trừ đối tượng Ngày
String jsonRepresentation = _gsonObj.toJson(_myobject);