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

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

Barbara Streisand
リリース: 2024-12-07 16:56:13
オリジナル
862 人が閲覧しました

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

Jackson のデフォルト デシリアライザへのカスタム デシリアライザ アクセス

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート