Rumah > Java > javaTutorial > Bagaimanakah Saya Boleh Mengakses Deserializer Lalai dalam Deserializer Jackson Tersuai?

Bagaimanakah Saya Boleh Mengakses Deserializer Lalai dalam Deserializer Jackson Tersuai?

Barbara Streisand
Lepaskan: 2024-12-07 16:56:13
asal
862 orang telah melayarinya

How Can I Access the Default Deserializer within a Custom Jackson Deserializer?

Akses Penyahserialisasi Tersuai kepada Penyahserialisasi Lalai di Jackson

Mengakses Penyahserialisasi Lalai

Di Jackson, penyahserialisasi tersuai membenarkan melanjutkan atau mengubah suai gelagat penyahserikatan lalai . Keperluan biasa ialah mengakses penyahserialisasi lalai untuk menyahsiri sebahagian objek sebelum menggunakan logik tersuai. Walau bagaimanapun, memanggil deserialize secara langsung dari dalam deserializer tersuai membawa kepada pengecualian limpahan tindanan.

Konfigurasi Deserializer Tersuai

Untuk menyelesaikan isu ini, BeanDeserializerModifier boleh dilaksanakan dan didaftarkan dengan SimpleModule. Pengubah suai ini boleh campur tangan semasa proses penciptaan penyahserialisasi dan suntikan penyahserialisasi lalai ke dalam penyahserialisasi tersuai kami.

Contoh Pelaksanaan

Kod berikut menunjukkan cara untuk mencapai ini:

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.module.BeanDeserializerModifier;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.util.StdDeserializer;

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;
  }

  // for some reason you have to implement ResolvableDeserializer when modifying BeanDeserializer
  // otherwise deserializing throws JsonMappingException??
  @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);
  }
}
Salin selepas log masuk

Dengan mendaftarkan modul ini dengan ObjectMapper, penyahserikatan tersuai untuk kelas Pengguna didayakan, membenarkan akses kepada lalai deserializer untuk pra-populasi objek sebelum menggunakan logik tersuai.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengakses Deserializer Lalai dalam Deserializer Jackson Tersuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan