1. ホーム
  2. java

Jackson:POJOを変更せずにJSONにカスタムプロパティを追加する方法

2023-10-02 18:33:22

質問

Jacksonを使用して、POJOドメイン・オブジェクトをJSON表現にシリアライズするアプリのRESTインターフェイスを開発しています。いくつかの型のシリアライズをカスタマイズして、POJO には存在しない追加のプロパティを JSON 表現に追加したいと考えています (たとえば、いくつかのメタデータや参照データを追加するなど)。私は、自分自身の JsonSerializer を書く方法も知っていますが、その場合、私は明示的に JsonGenerator.writeXXX(..) のメソッドを明示的に呼び出す必要があります。 それぞれ プロパティが必要なのに対して、私のオブジェクトの を追加します。 を追加するだけです。つまり、次のようなことを書けるようにしたい。

@Override
public void serialize(TaxonomyNode value, JsonGenerator jgen, SerializerProvider provider) {
    jgen.writeStartObject();
    jgen.writeAllFields(value); // <-- The method I'd like to have
    jgen.writeObjectField("my_extra_field", "some data");
    jgen.writeEndObject();
}

の前にシリアライズをインターセプトするか、(さらに良い方法は) jgen.writeEndObject() を呼び出す、などです。

@Override void beforeEndObject(....) {
    jgen.writeObjectField("my_extra_field", "some data");
}

を拡張できると思っていました。 BeanSerializer を継承し、その上に serialize(..) メソッドをオーバーライドしますが、宣言されている final の新しいインスタンスを作成する簡単な方法が見つかりませんでした。 BeanSerializer の新しいインスタンスを作成する簡単な方法を見つけることができませんでした。そのため、私はそれを行うことをあきらめました。

私の質問は - どのようにジャクソンのシリアライズをカスタマイズして、特定のPOJOのJSON出力に追加のものを追加すればよいでしょうか?

どのように解決するのですか?

について詳しく調べた結果 ジャクソン

のソース コードをさらに調べた結果、自分自身で BeanSerializer , BeanSerializerBuilderBeanSerializerFactory のように、いくつかの拡張ポイントを提供します。

/*
/**********************************************************
/* Extension points
/**********************************************************
 */

protected void beforeEndObject(T bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JSONException {
    // May be overridden
}

protected void afterStartObject(T bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JSONException {
    // May be overridden
}

残念ながら、私はすべての ジャクソン 's BeanSerializer のソースコードから MyCustomBeanSerializer というのは、前者はすべてのフィールドといくつかの重要なメソッドを宣言する拡張機能のために開発されたものではないからです ( serialize(...) のような) 重要なメソッドを final