簡體   English   中英

基於父上下文的自定義Jackson JSON序列化

[英]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屬性

SecureChildSerializerInsecureChildSerializer旨在實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM