2012-04-20 10 views
6

ジャクソンはメソッドベースのシリアライゼーションを行っていますが、フィールドベースの方法はありますか?ジャクソンフィールドベースのシリアル化

例:

class Bean { 
    Integer i; 
    String s; 

    public Integer getI() { return this.i; } 
    public void setI(Integer i) { this.i = i; } 
    public bool isSetI() { return this.i != null; } 

    // same for s as well 
} 

出力JSONは "I" や "SETI" を持っています。とにかく私はこれをオーバーライドして "i"だけを得ることができますか? また、クラスに注釈を追加せずにこれを行う方法があれば、素晴らしいことになります(それらは自動生成されます)。

+1

このコードはコンパイルされません。あなたはあなたが実際に使っているコードを投稿できますか?どのようにシリアライズしようとしていますか? –

答えて

5

を使用すると、次のように/デシリアライズをシリアライズする前にObjectMapperを設定することができ、注釈なしでこれを実現するには、次の

ObjectMapper om = new ObjectMapper(); 
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker(). 
      withGetterVisibility(JsonAutoDetect.Visibility.NONE). 
      withSetterVisibility(JsonAutoDetect.Visibility.NONE)); 
6

ジャクソンでもフィールドを使用できます。デフォルトではパブリックフィールドのみが検出されます。しかし、公開されていないフィールドには@JsonPropertyを付けることができます。

メソッド(setX、getX)とフィールド(x)の両方がある場合は、メソッドが優先されます。これは通常問題ではありませんが、そうであれば、使用しないメソッドを明示的に無効にしてから、@JsonIgnoreのenxtを追加する必要があります。

10

@JsonAutoDetect注釈を確認してください。例:

@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE) 
public class Bean { 
    Integer i; 
    String s; 

    Integer getI() { return this.i; } 
    void setI(Integer i) { this.i = i; } 
    bool isSetI() return { this.i == null; } 

    // same for s as well 
} 
3

受け入れ答えは私のために期待される結果を生成しませんでした。どのような注釈を追加することなく、私の作品は、次のようにObjectMapperを設定されています

ObjectMapper om = new ObjectMapper() 
     .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) 
     .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

これは、フィールドの代わりにゲッターを使用している、私にはより多くの意味を作るように見える方法です\標準のJavaシリアライゼーションのようなセッターだろう行う。