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.
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.
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); } }
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!