Jackson:POJOを変更せずにJSONにカスタムプロパティを追加する方法
質問
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
,
BeanSerializerBuilder
と
BeanSerializerFactory
のように、いくつかの拡張ポイントを提供します。
/*
/**********************************************************
/* 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
関連
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
Uncaught ReferenceError: は定義されていません。
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
シェルコマンドやスクリプトのJavaコール
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
Zipファイルの圧縮・解凍にantを使用する
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ
-
[解決済み] Json.netでシリアライズする際、プロパティ名を変更するにはどうすればよいですか?
-
[解決済み】JACKSONがフィールドのみを使用するように指定する方法 - できればグローバルに使用したい
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
javaの非静的メソッドを静的に参照することができない
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
SocketException java.netの4つの例外解決策。
-
java send https request prompt java.security.cert.について。
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
switch case文のcaseの後の列挙定数は列挙型なし
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
Zipファイルの圧縮・解凍にantを使用する
-
[解決済み】Javaでfinalキーワードを使用するとパフォーマンスが向上しますか?