2011-08-18 13 views
136

デフォルトのジャック動作では、プロパティ(ゲッターとセッター)とフィールドをシリアル化してjsonに逆シリアル化するように見えます。jacksonをフィールドのみを使用するように指定する方法 - 好ましくはグローバルに

フィールドをシリアル化設定の標準ソースとして使用したいので、jacksonがプロパティをまったく見たくないようにします。

私はアノテーションで個々のクラスごとにこれを行うことができます。

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) 

しかし、私は

がすることが可能です...一つ一つのクラスでこれを置くためにしたくありませんこれをグローバルに設定しますか? Object Mapperにいくつか追加するのと同じですか?

+1

ティムは良い答えを出しました。もう1つの可能性は、共通の基底クラスがある場合は、それにクラス注釈を付けることができます。注釈はJacksonによって継承されます。 – StaxMan

+1

私はそれを試みましたが、サブクラスに基本ケースの定義を伝える必要があるようです。 –

+2

サブクラスがクラス注釈をオーバーライドしない限り、親の注釈はサブキーの一部であるかのように見えますが、クラス定義(もしそうでなければ、これはバグでしょう)。これは、JDKがアノテーションをどのように取り扱うかを必ずしも示すものではありませんが、Jacksonはアノテーションの完全継承を実装しています(メソッドアノテーションの場合でも)。 – StaxMan

答えて

117

あなたは、このような個々のObjectMappersを設定することができます。

ObjectMapper mapper = new ObjectMapper(); 
mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker() 
       .withFieldVisibility(JsonAutoDetect.Visibility.ANY) 
       .withGetterVisibility(JsonAutoDetect.Visibility.NONE) 
       .withSetterVisibility(JsonAutoDetect.Visibility.NONE) 
       .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); 

あなたはそれがグローバルに設定したい場合は、私は通常、ラッパークラスを使用して設定マッパーにアクセスします。ジャクソン2.0で

+3

良いですが、あなたはチェッカー(withXxx()メソッドは通常新しいオブジェクトを作成する)を設定する必要があるかもしれません。だから、 'mapper.setVisibilityChecker(mapper.getVisibilityChecker()。with ...);' – StaxMan

+0

@StaxMan setVisibilityCheckerの良いコール、私は反映するために答えを編集しました。 –

+32

'withGetterVisibility'は' is * 'メソッドをカバーしませんが、' withIsGetterVisibility'があります。 – qerub

103

以降あなたは、単に使用することができます。

import com.fasterxml.jackson.annotation.JsonAutoDetect; 
import com.fasterxml.jackson.annotation.PropertyAccessor; 
import com.fasterxml.jackson.databind.ObjectMapper; 

... 

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

自動検出をオフにします。私は自動dedectionのオンにする

ObjectMapper mapper = new ObjectMapper(); 

mapper.setVisibility(JsonMethod.ALL, Visibility.NONE); 
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY); 

を使用ジャクソン1.9.10用

+1

こんにちは、 私はジャクソン1.9.0ジャーを使用しています。 オブジェクトをjson文字列にシリアル化しながら、追加のjsonプロパティを取得しています。 @JsonPropertyで上記の変数だけを含むjson文字列を取得する必要があります。 これで私を助けてもらえますか? – jrhamza

+6

OP質問に記載されているクラス注釈から始めることができます: '@JsonAutoDetect(fieldVisibility = Visibility.NONE、getterVisibility = Visibility.NONE、setterVisibility = Visibility.NONE)' 次に、あなたが含める各プロパティに注釈を付ける必要があります'@ JsonProperty' – lukk

10

+1

これは方法です。ありがとう。 – cuneytykaya

+0

この処理と「自動検出」を無効にすることには違いがあるのだろうかと疑問に思う。 – xenoterracide

22

私は多くの時間を費やしてきました:なぜどちら

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) 

setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE); 
    setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); 
    setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

私のブールゲッター/セッターのために動作しません。 ソリューションはsimpeです:

@JsonAutoDetect(isGetterVisibility = Visibility.NONE, ...   
    setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE); 
+0

Beanクラスにどのように単純なソリューションを適用すればよいか教えてください。 –

+1

ありがとうございます。それは私にとってゲッターがその日を救ったのです。 – grinch

7

これについてどのように:

@JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE) 
public static class TelemetryMixin {} 

使用法:

私はミックスイン

非準拠オブジェクト

@Entity 
@Getter 
@NoArgsConstructor 
public class Telemetry { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long pk; 
    private String id; 
    private String organizationId; 
    private String baseType; 
    private String name; 
    private Double lat; 
    private Double lon; 
    private Instant updateTimestamp; 
} 

ミックスインとそれを使用

ObjectMapper om = objectMapper.addMixIn(Telemetry.class, TelemetryMixin.class); 
    Telemetry[] telemetries = om.readValue(someJson, Telemetry[].class); 

あなたはいくつのクラスもforeachすることができず、同じmixinを適用することができないということは何もありません。

mixinsに慣れていない場合は、概念的には簡単です:mixinの構造はで、ターゲットクラスにはがスーパーチャージされています(jacksonによると、JVMに関する限りです)。