[英]how to only serialize properties annotated with a custom annotation
我們在整個應用程序中使用 jackson 將 Java 對象序列化和反序列化為 JSON。 它工作得很好。
是否可以通過自定義序列化程序僅序列化使用自定義注釋注釋的 Java 對象的屬性?
因此,給定自定義注釋:
public @interface SpecialField {}
和下面的豆
public SomeBean {
@SpecialField
private Object propertyIncluded;
private Object propertyExcluded;
}
自定義序列化程序(或某些等效機制)將如何序列化 propertyIncluded(使用普通的傑克遜對象映射器)並忽略 propertyExcluded?
我們不能在這個用例中使用標准的傑克遜注解(@JsonIgnore),因為它會破壞我們在應用程序中的其他序列化用例。
雖然這可能不是您想要的,但可以通過一些調整使傑克遜引擎以不同的方式序列化對象。 在下面的示例中,我創建了兩種類型的序列化程序,它們將或不會序列化標記為瞬態的字段。
import java.io.Serializable;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.map.ObjectMapper;
public class Test {
public static void main(String[] args) throws Exception {
ISerializer d = new Doesnt();
ISerializer o = new Observes();
SomeObject obj = new SomeObject();
System.out.println("Doesnt: " + d.serialize(obj));
System.out.println("Observes: " + o.serialize(obj));
}
public static class Doesnt implements ISerializer<SomeObject> {
@Override
public String serialize(SomeObject o) throws Exception {
ObjectMapper om = new ObjectMapper();
om.setVisibilityChecker(
om.getSerializationConfig().
getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).
withGetterVisibility(JsonAutoDetect.Visibility.ANY));
return om.writeValueAsString(o);
}
}
public static class Observes implements ISerializer<SomeObject> {
@Override
public String serialize(SomeObject o) throws Exception {
ObjectMapper om = new ObjectMapper();
om.setVisibilityChecker(
om.getSerializationConfig().
getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).
withGetterVisibility(JsonAutoDetect.Visibility.NONE));
return om.writeValueAsString(o);
}
}
public interface ISerializer<T> {
public String serialize(T o) throws Exception;
}
public static class SomeObject implements Serializable {
private static final long serialVersionUID = 745063791749142843L;
private transient String myVar = "Transient";
private String myOther = "Not Transient";
public String getMyVar() {
return myVar;
}
public void setMyVar(String myVar) {
this.myVar = myVar;
}
public String getMyOther() {
return myOther;
}
public void setMyOther(String myOther) {
this.myOther = myOther;
}
}
}
輸出:
Doesnt: {"myVar":"Transient","myOther":"Not Transient"}
Observes: {"myOther":"Not Transient"}
我認為更改序列化程序以擴展 JsonSerializer 類並在其中做類似的事情會相當容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.