답변:
Jackson> 2.0을 사용하여 null 값으로 속성을 직렬화하지 않도록하려면 직접을 구성ObjectMapper
하거나 @JsonInclude
주석 을 사용할 수 있습니다 .
mapper.setSerializationInclusion(Include.NON_NULL);
또는:
@JsonInclude(Include.NON_NULL)
class Foo
{
String bar;
}
또는 @JsonInclude
값이 null이 아닌 경우 속성이 표시되도록 getter에서 사용할 수 있습니다 .
더 완벽한 예에서 볼 수 있습니다 내 대답 에 잭슨을 통해 직렬화하기에서 빈 내부지도 내부 널 (null) 값과 널 (null) 필드를 방지하는 방법 .
@JsonInclude
표기법이 작동하지 않는다는 것을 확인 했지만 매력처럼 작동합니다. @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
(저는 Spring 3.2.2에서 Jackson 1.9.12를 사용하고 있습니다.)
@JsonSerialize
구문 에서로 변경되었습니다 @JsonInclude
. 이전 구문은 더 이상 사용되지 않습니다.
Jackson> 1.9.11 및 <2.x에서는 @JsonSerialize
주석을 사용 하여 다음을 수행하십시오.
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL)
작동하지 않습니다. 널 입력 가능 값이 직렬화됩니다.
다른 답변을 확장하기 위해-필드별로 null 값 생략을 제어 해야하는 경우 해당 필드에 주석을 추가하십시오 (또는 필드의 'getter'에 주석을 달으십시오).
예- 여기서는 fieldOne
null 인 경우 에만 json에서 생략됩니다. fieldTwo
null인지 여부에 관계없이 항상 포함됩니다.
public class Foo {
@JsonInclude(JsonInclude.Include.NON_NULL)
private String fieldOne;
private String fieldTwo;
}
클래스의 모든 null 값을 기본값으로 생략하려면 클래스에 주석을 답니다. 필요한 경우 필드 별 / 게터 주석을 사용하여이 기본값을 무시할 수 있습니다.
예 - 여기 fieldOne
와 fieldTwo
그들이 각각 null의 경우이 클래스 주석하여 기본 설정이기 때문에, JSON에서 ommitted됩니다. fieldThree
그러나 기본값을 무시하고 필드의 주석으로 인해 항상 포함됩니다.
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Foo {
private String fieldOne;
private String fieldTwo;
@JsonInclude(JsonInclude.Include.ALWAYS)
private String fieldThree;
}
최신 정보
위의 내용은 Jackson 2 입니다. 들어 이전 버전 잭슨의 당신은 사용할 필요가 :
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
대신에
@JsonInclude(JsonInclude.Include.NON_NULL)
이 업데이트가 유용하면 아래에서 ZiglioUK의 답변을 찬성하십시오. 답변을 업데이트하기 전에 최신 Jackson 2 주석을 지적했습니다!
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
더 이상 사용되지 않습니다
Jackson 2.x에서 다음을 사용하십시오.
@JsonInclude(JsonInclude.Include.NON_NULL)
com.fasterxml.jackson.annotation
Jackson 1.x는org.codehaus.jackson.annoation
다음과 같은 매퍼 구성을 사용할 수 있습니다.
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
2.5 이후로 다음을 수행 할 수 있습니다.
mapper.setSerializationInclusion(Include.NON_NULL);
getSerializationConfig()
:Note that since instances are immutable, you can NOT change settings by accessing an instance and calling methods: this will simply create new instance of config object.
mapper.setSerializationInclusion(Include.NON_NULL);
당신은 설정할 수 있습니다 application.properties
:
spring.jackson.default-property-inclusion=non_null
또는 application.yaml
:
spring:
jackson:
default-property-inclusion: non_null
http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
나의 경우에는
@JsonInclude(Include.NON_EMPTY)
작동하게 만들었습니다.
{ }
null 과 같은 것을 얻을 수 있으므로 Java 관용구를 소비자에게 무의미하게 전송합니다. 소비자는 AtomicReference와 동일합니다. 소비자는 개발자가 응답의 내부 표현에 스레드 안전성을 적용하기로 선택한 방식에 신경 쓰지 않습니다.
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
작동해야합니다.
Include.NON_EMPTY
값이 null이 아니고 비어 있지 않은 경우 속성이 직렬화됨을 나타냅니다.
Include.NON_NULL
값이 null이 아닌 경우 속성이 직렬화됨을 나타냅니다.
JsonInclude.Include.NON_EMPTY
NOT_NULL 사례를 다루기 때문에 충분합니다
Spring Boot 인 경우 ObjectMapper
속성 파일을 통해 잭슨을 직접 사용자 정의 할 수 있습니다 .
예 application.yml
:
spring:
jackson:
default-property-inclusion: non_null # only include props if non-null
가능한 값은 다음과 같습니다.
always|non_null|non_absent|non_default|non_empty
이것은 Spring boot 2.0.3 이상 및 Jackson 2.0 이상 에서 작동합니다
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiDTO
{
// your class variable and
// methods
}
@JsonInclude(JsonInclude.Include.NON_NULL)
나를 위해 일한 봄 2.1.2를 부팅 하고 잭슨 2.9.0 주석을
이것은 꽤 오랫동안 나를 괴롭 히고 있었고 마침내 문제를 발견했습니다. 가져 오기가 잘못되어 문제가 발생했습니다. 내가 사용했던 이전
com.fasterxml.jackson.databind.annotation.JsonSerialize
더 이상 사용되지 않습니다. 가져 오기를
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
그것을 다음과 같이 사용하십시오
@JsonSerialize(include=Inclusion.NON_NULL)
Spring을 사용하는 경우 전역 구성
@Configuration
public class JsonConfigurations {
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
builder.failOnUnknownProperties(false);
return builder;
}
}
public Jackson2ObjectMapperBuilder serializationInclusion(JsonInclude.Include serializationInclusion) { this.serializationInclusion = serializationInclusion; return this; }
; 더 큰 포함 반경을 사용해야합니다. 예를 들어 NON_ABSENT는 NON_NULL을 포함하고 NON_EMPTY는 둘 다를 포함합니다. 따라서 그것은 단지해야 builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
JacksonInclude의 문서를
객체 목록을 직렬화하려고 시도하고 그중 하나가 null 인 경우 JSON에 null 항목을 포함시킵니다.
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
결과 :
[{myObject},null]
이것을 얻으려면 :
[{myObject}]
하나는 다음과 같은 것을 할 수 있습니다 :
mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object obj, JsonGenerator jsonGen, SerializerProvider unused)
throws IOException
{
//IGNORES NULL VALUES!
}
});
팁 : DropWizard를 ObjectMapper
사용하는 경우 Jersey를 사용하여 사용중인 것을 검색 할 수 있습니다.environment.getObjectMapper()
이 질문에 대한 답변이 많이 있습니다. 이 답변은 일부 시나리오에서 도움이 될 수 있습니다. null 값을 무시하려면 클래스 수준에서 NOT_NULL을 사용할 수 있습니다. 아래
@JsonInclude(Include.NON_NULL)
class Foo
{
String bar;
}
때로는 arrayList를 초기화했을 때와 같이 빈 값을 무시해야 할 수도 있지만 해당 목록에 요소가 없습니다. 그 당시 NOT_EMPTY 주석을 사용하여 빈 값 필드를 무시하십시오.
@JsonInclude(Include.NON_EMPTY)
class Foo
{
String bar;
}
Jackson 2.x + 사용
mapper.getSerializationConfig().withSerializationInclusion(JsonInclude.Include.NON_NULL);
.withSerializationInclusion(JsonInclude.Include.NON_NULL)
대신 맞습니까?
getSerializationConfig()
:Note that since instances are immutable, you can NOT change settings by accessing an instance and calling methods: this will simply create new instance of config object.
또한 널을 줄이려면 문서에 설명 된대로 Map myVariable을 사용할 때 접근 방식을 변경해야합니다.
From documentation:
com.fasterxml.jackson.annotation.JsonInclude
@JacksonAnnotation
@Target(value={ANNOTATION_TYPE, FIELD, METHOD, PARAMETER, TYPE})
@Retention(value=RUNTIME)
Annotation used to indicate when value of the annotated property (when used for a field, method or constructor parameter), or all properties of the annotated class, is to be serialized. Without annotation property values are always included, but by using this annotation one can specify simple exclusion rules to reduce amount of properties to write out.
*Note that the main inclusion criteria (one annotated with value) is checked on Java object level, for the annotated type, and NOT on JSON output -- so even with Include.NON_NULL it is possible that JSON null values are output, if object reference in question is not `null`. An example is java.util.concurrent.atomic.AtomicReference instance constructed to reference null value: such a value would be serialized as JSON null, and not filtered out.
To base inclusion on value of contained value(s), you will typically also need to specify content() annotation; for example, specifying only value as Include.NON_EMPTY for a {link java.util.Map} would exclude Maps with no values, but would include Maps with `null` values. To exclude Map with only `null` value, you would use both annotations like so:
public class Bean {
@JsonInclude(value=Include.NON_EMPTY, content=Include.NON_NULL)
public Map<String,String> entries;
}
Similarly you could Maps that only contain "empty" elements, or "non-default" values (see Include.NON_EMPTY and Include.NON_DEFAULT for more details).
In addition to `Map`s, `content` concept is also supported for referential types (like java.util.concurrent.atomic.AtomicReference). Note that `content` is NOT currently (as of Jackson 2.9) supported for arrays or java.util.Collections, but supported may be added in future versions.
Since:
2.0
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
; 어떻게 든 주석을 사용할 수 없었습니다.