[java] 필드만을 사용하도록 Jackson을 지정하는 방법-전역 적으로

기본 jackon 동작은 속성 (getter 및 setter)과 필드를 모두 사용하여 json을 직렬화하고 역 직렬화하는 것으로 보입니다.

필드를 직렬화 구성의 정식 소스로 사용하고 싶기 때문에 잭슨이 속성을 전혀 보지 않기를 바랍니다.

주석을 사용하여 개별 클래스 별로이 작업을 수행 할 수 있습니다.

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

그러나 나는 이것을 모든 단일 수업에 배치하고 싶지는 않습니다 …

이것을 전역 적으로 구성 할 수 있습니까? 객체 매퍼에 일부를 추가하는 것처럼?



답변

다음과 같이 개별 ObjectMappers를 구성 할 수 있습니다.

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

전역으로 설정하려면 일반적으로 래퍼 클래스를 통해 구성된 매퍼에 액세스합니다.


답변

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

자동 감지 기능을 해제합니다.


답변

boolean is*()게터를 위해 특별히 :

나는 왜 아래에 많은 시간을 보냈지

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

부울 Getter / Setter에서 일했습니다.

해결책은 간단합니다.

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

업데이트 : 스프링 부트 허용 구성 :

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

참조 일반적인 응용 프로그램 속성 # JACKSON


답변

jackson 1.9.10의 경우 사용합니다

ObjectMapper mapper = new ObjectMapper();

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

자동 제거 기능을 켜십시오.


답변

어떻습니까 : 믹스 인과 함께 사용했습니다.

비준수 객체

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

당신이 클래스를 가르 칠 수없고 같은 믹스 인을 적용 할 수 없다는 말은 없습니다.

믹스 인에 익숙하지 않다면, 그것들은 개념적으로 간단합니다 : 믹스 인의 구조는 (JVM에 관한 한 잭슨에 따르면) 대상 클래스에 슈퍼 임 포즈 됩니다.


답변

의 구성에 대해 걱정하지 않고 전 세계적 으로이 작업을 수행하는 방법을 원한다면 ObjectMapper고유 한 주석을 만들 수 있습니다.

@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonAutoDetect(
        getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE,
        setterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE,
        creatorVisibility = JsonAutoDetect.Visibility.NONE
)
public @interface JsonExplicit {
}

이제 수업에 주석을 달아야합니다 @JsonExplicit.

또한 위의 호출을 편집하여 @JsonAutoDetect값이 프로그램에서 작동하는 값으로 설정되어 있는지 확인하십시오.

에 신용 https://stackoverflow.com/a/13408807 저를 도와 주셔서 대해 알아@JacksonAnnotationsInside


답변

Spring Boot를 사용하는 경우 다음과 같이 Jackson을 전역 적 으로 구성 할 수 있습니다 .

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@Configuration
public class JacksonObjectMapperConfiguration implements Jackson2ObjectMapperBuilderCustomizer {

    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder.visibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
        jacksonObjectMapperBuilder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
        jacksonObjectMapperBuilder.visibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.ANY);
    }

}