2013-01-13 14 views
5

ジャクソンでJSONシリアル化を使用して、デバッグプロパティのシステムの内部状態を公開します。jacksonを使用して過渡フィールドをシリアル化する方法は?

デフォルトでは、jacksonは一時フィールドをシリアル化しませんが、それらもシリアル化します。 これらのフィールドをシリアル化するにはどうすればよいですか?

私が知っている一つの方法は、これらのフィールドのゲッターを提供することです - しかし、私は私が呼びたくないgetXメソッドをいくつか持っているので(例えば、いくつかのゲッターオブジェクトの状態を変更します)。

私は注釈を作成することができますが、実際にはそれを避けたいと思います。

私の質問は: シリアル化するためにジャクソンを設定する方法はありますかすべてオブジェクトフィールド?一時的なものを含む。

+1

あなたはjavax.persistence.Transientフィールド@シリアライズしたい場合は、[・ギアの答え](http://stackoverflow.com/a/29109806/606662)を参照してください: –

+0

は@Markus Pscheidtで合意 – dirai

答えて

6

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

だから私の質問は次のとおりです。すべての をシリアル化するためのセットアップ・ジャクソンへの道がありますオブジェクトフィールド?一時的なものを含む。

質問に答えてください。

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

少し拡張するには、別の方法を試してみてください。

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

第2に、ゲッターを使用して「オブジェクトの状態を変更するゲッターを持つ」ことについては、それも避けるべきです。それは様々な意図しない結果につながる可能性があります。そして、技術的にはゲッターではない、それはセッターです。私が意味することは、状態を変更すると、 "get"規約に従って名前を付けていくつかのものを返すとしても、アクセサー(ゲッター)ではなくミューテータ(セッター)が得られるということです。

0

この一時フィールドのカスタムゲッターを作成し、@ XmlElement属性を使用することができます。そのゲッターの名前は重要ではありません。例えば

public class Person { 

    @XmlTransient private String lastname; 

    @XmlElement(name="lastname") 
    public String getAnyNameOfMethod(){ 
     return lastname; 
    } 

} 
10

ジャクソン2.4と私のソリューション。3:

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

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

     }}; 
関連する問題