[英]Custom Jackson JSON serialization based on parent context
我試圖根據父母的信息有條件地序列化一個子bean。
public class Parent {
private boolean isSecure;
private Child child;
}
public class Child {
String someValue;
}
基本上,如果parent.isSecure()
為true,那么我想以不同於parent.isSecure()
為false的方式序列化someValue
。
我的實際類比這個簡單的例子復雜得多,所以我真的不想為Parent
創建一個完整的自定義序列化器,我需要單獨維護(除非你能告訴我如何在自定義中利用Parent
標准序列化)序列化程序,無需遍歷所有屬性並處理JSON注釋,視圖等。如果可以,這可能會起作用,因為我可以基於isSecure()
設置上下文屬性。
我不介意為孩子編寫自定義序列化程序,但我不知道如何檢查父項的值。
我已經考慮過使用“安全”視圖和“不安全”視圖,我可以在整個序列化過程之外指定,但是我必須經歷並注釋父類的許多屬性都在'secure'中和'不安全'視圖(因為我已經關閉了DEFAULT_VIEW_INCLUSION
選項,因為我從不想要序列化許多屬性)。
我試圖在我的自定義子序列化generator.getCurrentValue()
中訪問generator.getCurrentValue()
,但它總是為null,所以我不確定它應該如何工作。
我已經考慮過為isSecure
編寫一個自定義序列化isSecure
,並在其中設置一個上下文屬性,但是我怎么能確定它會在孩子的自定義序列化程序之前被調用? (雖然我承認我不確定上下文屬性是否真正按照我假設的方式工作。)
有任何想法嗎?
您可以創建特定於isSecure
方案的序列化isSecure
。 在子元素中使用JsonGenerator#getCurrentValue
將返回父元素。 這樣的事情應該允許您控制Child
序列化,而不必修改Parent
上其他屬性的序列化。
Child
序列化程序以檢查Parent
屬性 SecureChildSerializer
和InsecureChildSerializer
旨在實現JsonSerializer<Child>
public class IsSecureChildSerializer extends JsonSerializer<Child> {
private static final SecureChildSerializer SECURE_CHILD_SERIALIZER = new SecureChildSerializer();
private static final InsecureChildSerializer INSECURE_CHILD_SERIALIZER = new InsecureChildSerializer();
@Override
public void serialize(Child value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (gen.getCurrentValue() instanceof Parent) {
Parent parent = (Parent) gen.getCurrentValue();
if (parent.isSecure) {
SECURE_CHILD_SERIALIZER.serialize(value, gen, serializers);
} else {
INSECURE_CHILD_SERIALIZER.serialize(value, gen, serializers);
}
}
}
}
Child
序列化程序應用於所關注的屬性 public class Parent {
public boolean isSecure;
@JsonSerialize(using = IsSecureChildSerializer.class)
public Child child;
}
我不知道你的設計的全長,但恕我直言,我認為這表明設計中有點問題。 如果對象的解析方式不同,則意味着它們本質上是不同的 - 在這種情況下,為什么不通過繼承將它們分開? 一種方法是:
public class Parent {
private Child child;
}
public class SecureChild extends Parent {
String someValue;
}
public class InSecureChild extends Parent {
String someValue;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.