web-dev-qa-db-ja.com

フィールドのみを使用するためにjacksonを指定する方法-できればグローバルに

デフォルトのjackonの動作では、プロパティ(ゲッターとセッター)とフィールドの両方を使用してjsonにシリアライズおよびデシリアライズします。

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

アノテーションを使用して、個々のクラスごとにこれを行うことができます:

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

しかし、私はすべてのクラスにこれを置く必要はありません...

これをグローバルに構成することは可能ですか? Object Mapperにいくつか追加しますか?

169
Michael Wiles

以下のように、個々の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));

グローバルに設定する場合は、通常、ラッパークラスを使用して構成済みのマッパーにアクセスします。

140
Tim Helmstedt

ジャクソン2.0以降では、単に次を使用できます。

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);

自動検出をオフにします。

138
lukk

特にboolean is*() getterの場合:

以下の理由に多くの時間を費やしました

  @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);

ブール型ゲッター/セッターで働いていました。

解決策は簡単です。

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

更新:spring-bootで設定可能:

jackson:
  visibility.field: any
  visibility.getter: none
  visibility.setter: none
  visibility.is-getter: none

一般的なアプリケーションプロパティ#JACKSON を参照してください

32
GKislin

ジャクソン1.9.10用

ObjectMapper mapper = new ObjectMapper();

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

自動検出をオフにします。

12
mfe

これはどうですか:mixinで使用しました

非準拠オブジェクト

@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;
}

混入します:

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

使用法:

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

クラスの数をforeachできず、同じmixinを適用できなかったということはありません。

ミックスインに慣れていない場合、概念的には単純です:ミックスインの構造は、ターゲットクラスでスーパーインポーズです(JVMに関する限りでは、ジャクソンによる)。

10