기본 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 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);
}
}