ホームページ >Java >&#&チュートリアル >カスタム デシリアライザー内のデフォルトの Jackson デシリアライザーにアクセスするにはどうすればよいですか?

カスタム デシリアライザー内のデフォルトの Jackson デシリアライザーにアクセスするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-01 17:43:10707ブラウズ

How to Access the Default Jackson Deserializer within a Custom Deserializer?

Jackson Custom Deserializer のデフォルトのデシリアライザへのアクセス

Jackson でデシリアライゼーションをカスタマイズする場合、デフォルトのデシリアライゼーション動作を利用する必要があるシナリオが存在する場合があります。カスタム ロジックを適用する前に。この要件に対処するために、カスタム デシリアライザー内からデフォルトのデシリアライザーにアクセスするための包括的なガイドを次に示します。

次のシナリオを考えてみましょう。

public class UserEventDeserializer extends StdDeserializer<User> {

    public UserEventDeserializer() {
        super(User.class);
    }

    @Override
    public User deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {

        User deserializedUser = null;
        try {
            deserializedUser = super.deserialize(jp, ctxt, new User());
        } catch (UnsupportedOperationException e) {
            // Access default Jackson deserializer here
        }
        // Perform custom logic on deserializedUser...

        return deserializedUser;
    }
}

解決策: BeanDeserializerModifier

デフォルトのデシリアライザーにアクセスするための推奨されるアプローチは、 BeanDeserializerModifier。これにより、特定の Bean クラス (この場合は User) のデフォルトの動作を変更できます。

public class UserDeserializerModifier extends BeanDeserializerModifier {

    @Override
    public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
        if (beanDesc.getBeanClass() == User.class) {
            return new JsonDeserializer<>(); // Default deserializer
        }
        return super.modifyDeserializer(config, beanDesc, deserializer);
    }
}

使用例

カスタム修飾子を使用するには、それを登録しますSimpleModule を使用してそれを設定しますObjectMapper:

SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new UserDeserializerModifier());

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

注: このアプローチを使用する場合、JsonMappingException を回避するには、ResolvableDeserializer の実装が必要になる場合があります。

代替アプローチ

BeanDeserializerModifier が信頼性が高く柔軟なソリューションです。代替アプローチをいくつか示します。

  • AnnotationIntrospector のオーバーライド: これには、AnnotationIntrospector の拡張と、@Transactional などのアノテーションの動作の変更が含まれます。ただし、より複雑になる可能性があり、常に期待どおりに動作するとは限りません。
  • JsonDeserializerBuilder の使用: このアプローチでは、Spring からアプリケーション コンテキストにアクセスする必要があり、これより簡単ではない可能性があります。 BeanDeserializerModifier.

結論

BeanDeserializerModifier を活用すると、カスタム デシリアライザー内のデフォルトの Jackson デシリアライザーに効果的にアクセスして利用でき、柔軟で効率的なデシリアライズ動作が可能になります。 .

以上がカスタム デシリアライザー内のデフォルトの Jackson デシリアライザーにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。