デフォルトのjackonの動作では、プロパティ(ゲッターとセッター)とフィールドの両方を使用してjsonにシリアライズおよびデシリアライズします。
シリアル化設定の標準的なソースとしてフィールドを使用したいので、jacksonがプロパティをまったく見たくないのです。
アノテーションを使用して、個々のクラスごとにこれを行うことができます:
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
しかし、私はすべてのクラスにこれを置く必要はありません...
これをグローバルに構成することは可能ですか? Object Mapperにいくつか追加しますか?
以下のように、個々の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以降では、単に次を使用できます。
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);
自動検出をオフにします。
特に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 を参照してください
ジャクソン1.9.10用
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(JsonMethod.ALL, Visibility.NONE);
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
自動検出をオフにします。
これはどうですか: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に関する限りでは、ジャクソンによる)。