2011-07-26 14 views
1

Jacksons ObjectMapperに自分のクラスを直列化するように指示する方法を教えてください。シリアライザを提供する必要がありますか?私はジャクソンが自動的にすべてを行い方法はすでに作品がMyTypeのシリアライズとデシリアライゼーションの「戦略」を指定せずに、そこにあると信じてJackson 1.8.0任意のクラスを直列化/逆直列化するObjectMapper

public class MyType { 
    private int a; 
    private String b; 
    // Getters and Setters 
} 

// TODO: configure ObjectMapper, such that the following is true: 

objectMapper.canDeserialize(type) 

は、次の例を考えてみましょう。

ありがとうございました!

答えて

2

私はカスタムクラスに問題がありました。なぜなら、あいまいなセッターメソッドがあったからです。 @JsonSetterでsetterとして使用したいメソッドのonoeに注釈を付けると、すべて正しいです。

public class MyType { 
    private int a; 

    @JsonSetter 
    public void setA(int a) {...} 

    public void setA(String a) {...} 
} 

注釈なしでは、objectMapper.deserialize(...)は失敗します。内部的には、より多くの情報を提供する例外がスローされますが、キャッチされたものだけが返されます。

+0

これは、そうすることで、複数のJSONデータ型(JSON番号、文字列、オブジェクト、配列)をPOJOにマッピングできるようになるため、Jacksonとの改良がうまくいくものです。私はこれも提出されたRFEがあると思います。 – StaxMan

4

はい、カスタムシリアライザなしでPOJOをシリアル化できます。 しかし、あなたの場合の問題は、すべてのプロパティが「隠されている」ということです。デフォルトでは、ジャクソンはためになります。

  • 公共分野とゲッター(のgetXXX())
  • セッター(のsetXXX())

あなたは注釈を付けることができジャクソンはプライベートフィールドを使うようにするために、任意の可視性のすべてのプライベート(または保護されたパッケージで表示可能な)フィールドが見つかるようにするには、@ JsonPropertyを使用します。 注釈(@JsonAutoDetect)、またはグローバルな可視性チェッカーを定義することでこれを行うことができます。

関連する問題