Jackson では、カスタム デシリアライザを使用してデフォルトのデシリアライザ動作を拡張または変更できます。 。一般的なニーズは、カスタム ロジックを適用する前に、デフォルトのデシリアライザーにアクセスしてオブジェクトを部分的にデシリアライズすることです。ただし、カスタム デシリアライザー内から deserialize を直接呼び出すと、スタック オーバーフロー例外が発生します。
この問題を解決するには、BeanDeserializerModifier を実装し、SimpleModule に登録できます。この修飾子は、デシリアライザーの作成プロセス中に介入し、デフォルトのデシリアライザーをカスタム デシリアライザーに挿入できます。
次のコードは、これを実現する方法を示しています。
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); } }
このモジュールを ObjectMapper に登録すると、User クラスのカスタム逆シリアル化が有効になり、カスタム ロジックを適用する前にオブジェクトを事前設定するためのデフォルトのデシリアライザー。
以上がカスタム Jackson デシリアライザー内のデフォルトのデシリアライザーにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。