java - كيفية تحديد jackson لاستخدام الحقول فقط-ويفضل أن يكون عالميًا




json (4)

في Jackson 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);

لإيقاف autodetection.

يبدو أن سلوك المقامرة الافتراضي يستخدم كلا الخواص (الحاصلون والمستأجرون) والحقول لإجراء التسلسل وإلغاء التسلسل إلى json.

أرغب في استخدام الحقول كمصدر أساسي لتكوين التسلسل ، وبالتالي لا أريد أن ينظر جاكسون إلى الخصائص على الإطلاق.

يمكنني القيام بذلك على أساس فردي مع التعليق التوضيحي:

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

لكنني لا أريد أن أضع هذا على كل طبقة واحدة ...

هل من الممكن تكوين هذا على الصعيد العالمي؟ مثل إضافة بعض إلى مخطط كائن؟


لجاكسون 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;
}

Mixin:

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

لا يوجد شيء يقول أنه لا يمكن وصف أي عدد من الطبقات وتطبيق نفس المزيج.

إذا لم تكن على دراية بالخلطات ، فهي بسيطة من الناحية المفاهيمية: هيكل المزيج مفروض على الفئة المستهدفة (وفقا لجاكسون ، وليس بقدر ما يتعلق JVM).


يمكنك تكوين 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));

إذا كنت ترغب في تعيينها على مستوى العالم ، فأنا عادة ما أقوم بالوصول إلى مخطط معين من خلال فئة ملحقة.







jackson