Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Memanfaatkan Gelagat Penyahserialisasi Lalai Dalam Penyahserialisasi Jackson Tersuai?

Bagaimanakah Saya Boleh Memanfaatkan Gelagat Penyahserialisasi Lalai Dalam Penyahserialisasi Jackson Tersuai?

Susan Sarandon
Susan Sarandonasal
2024-12-03 15:44:10912semak imbas

How Can I Leverage Default Deserialization Behavior Within a Custom Jackson Deserializer?

Penyahserikatan Tersuai dengan Gelagat Lalai dalam Jackson

Apabila melaksanakan penyahserialisasi tersuai dalam Jackson, mungkin perlu menggunakan penyahserialisasi lalai untuk pra- isikan objek sebelum menggunakan logik tersuai. Artikel ini menangani cabaran untuk mengakses deserializer lalai daripada yang tersuai.

Untuk mencapai matlamat ini, buat BeanDeserializerModifier dan daftarkannya menggunakan SimpleModule. Berikut ialah contoh:

public class UserEventDeserializer extends StdDeserializer<User> implements ResolvableDeserializer {

    private static final long serialVersionUID = 7923585097068641765L;

    private final JsonDeserializer<?> defaultDeserializer;

    public UserEventDeserializer(JsonDeserializer<?> defaultDeserializer) {
        super(User.class);
        this.defaultDeserializer = defaultDeserializer;
    }

    @Override
    public User deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        User deserializedUser = (User) defaultDeserializer.deserialize(jp, ctxt);

        // Special logic

        return deserializedUser;
    }

    @Override
    public void resolve(DeserializationContext ctxt) throws JsonMappingException {
        ((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
    }

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
        SimpleModule module = new SimpleModule();
        module.setDeserializerModifier(new BeanDeserializerModifier() {
            @Override
            public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
                if (beanDesc.getBeanClass() == User.class)
                    return new UserEventDeserializer(deserializer);
                return deserializer;
            }
        });

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(module);
        User user = mapper.readValue(new File("test.json"), User.class);
    }
}

Dalam contoh ini:

  1. UserEventDeserializer memanjangkan kedua-dua StdDeserializer dan ResolvableDeserializer.
  2. Ia mengambil deserializer lalai sebagai hujah pembina.
  3. Kaedah deserialisasi terlebih dahulu deserialisasi menggunakan deserializer lalai, kemudian menggunakan logik tersuai pada objek yang terhasil.
  4. Ia melaksanakan ResolvableDeserializer untuk mengelakkan pengecualian pemetaan.
  5. BeanDeserializerModifier digunakan untuk menggantikan deserializer lalai untuk Pengguna dengan deserializer tersuai.

Dengan mendaftarkan modul ini dengan ObjectMapper, logik penyahserialisasian tersuai boleh digunakan sambil masih mendapat manfaat daripada gelagat lalai untuk kelas lain.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memanfaatkan Gelagat Penyahserialisasi Lalai Dalam Penyahserialisasi Jackson Tersuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn