7

Jackson で JSON シリアル化を使用して、プロパティをデバッグするためにシステムの内部状態を公開します。

デフォルトでは、jackson は一時フィールドをシリアライズしませんが、同様にシリアライズしたいと考えています。これらのフィールドをシリアル化するにはどうすればよいですか?

私が知っている 1 つの方法は、これらのフィールドにゲッターを提供することですが、呼び出されたくない getX メソッドがいくつかあるため、そうしたくありません (たとえば、オブジェクトを変更するゲッターがいくつかあります)。州 )。

注釈を作成できることはわかっていますが、本当に避けたいです。

だから私の質問は:すべてのオブジェクト フィールドをシリアル化するように jackson をセットアップする方法はありますか? 一時的なものを含みます。

4

4 に答える 4

12

Jackson 2.4.3 での私の解決策:

  private static final ObjectMapper mapper =
        new ObjectMapper(){{

            Hibernate4Module module = new Hibernate4Module();
            module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
            registerModule(module);

        }};
于 2015-03-17T21:12:34.753 に答える
7

Jackson が一時的なフィールドをシリアル化できるようにするための構成をサポートしているとは思いません。その機能を追加するための未解決の問題がありますが、それは古く、対処されていません (私が知る限り): http://jira.codehaus.org/browse/JACKSON-623

だから私の質問は: すべてのオブジェクト フィールドをシリアル化するように jackson をセットアップする方法はありますか? 一時的なものを含みます。

あなたの質問に答えるには、いいえ。

GSON などの他の Java JSON ツールは、一時的なフィールドをシリアル化するための構成オプションをサポートしています。別のツールを使用できる場合は、それを調べることができます (GSON については、https ://sites.google.com/site/gson/gson-user-guide を参照してください)。

少し拡張するには、別のアプローチを試すことができます。

まず、一時的なフィールドをシリアル化しようとしないでください。結局のところ、一時的な定義は「これをシリアライズしないでください」です。それにもかかわらず、それが必要な、または少なくとも便利な (変更できないコードを操作する場合など) いくつかの特定の状況を考えることができます。それでも、99% の場合、答えはそうしないことです。シリアル化する必要がある場合は、一時的でないようにフィールドを変更します。同じフィールドを使用する複数のコンテキストがあり、1 つのフィールド (JSON など) でシリアライズし、別のフィールド (java.io など) ではシリアライズしない場合は、カスタム シリアライザーを作成する必要があります。キーワードを乱用するのではなく、それを望まない.

第二に、ゲッターを使用し、「オブジェクトの状態を変更するいくつかのゲッター」を持つことに関しては、それも避けるようにしてください。それは、さまざまな意図しない結果につながる可能性があります。そして、技術的には、それはゲッターではなく、セッターです。つまり、状態を変更する場合、「get」規則に従って名前を付けて何かを返す場合でも、アクセサー (ゲッター) ではなくミューテーター (セッター) を持っているということです。

于 2013-01-13T14:04:54.230 に答える