Jackson이 값이 null 인 경우 직렬화 중에 필드를 무시하도록 지시하는 방법은 무엇입니까?


687

해당 필드 값이 null 인 경우 직렬화 중에 필드 값을 무시하도록 Jackson을 구성하는 방법

예를 들면 다음과 같습니다.

public class SomeClass {
   // what jackson annotation causes jackson to skip over this value if it is null but will 
   // serialize it otherwise 
   private String someValue; 
}

답변:


1102

Jackson> 2.0을 사용하여 null 값으로 속성을 직렬화하지 않도록하려면 직접을 구성ObjectMapper 하거나 @JsonInclude주석 을 사용할 수 있습니다 .

mapper.setSerializationInclusion(Include.NON_NULL);

또는:

@JsonInclude(Include.NON_NULL)
class Foo
{
  String bar;
}

또는 @JsonInclude값이 null이 아닌 경우 속성이 표시되도록 getter에서 사용할 수 있습니다 .

더 완벽한 예에서 볼 수 있습니다 내 대답잭슨을 통해 직렬화하기에서 빈 내부지도 내부 널 (null) 값과 널 (null) 필드를 방지하는 방법 .


81
내 프로젝트의 경우 다음과 같이 작동했습니다. @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL); 어떻게 든 주석을 사용할 수 없었습니다.
Emmanuel Touzery

13
API는 2.0 릴리스에서 약간 변경되었습니다.
프로그래머 Bruce

11
@ProgrammerBruce -1 변경 사항을 알고 있으므로 그에 따라 답변을 변경하십시오.
Martin Asenov

19
예, 방금 @JsonInclude표기법이 작동하지 않는다는 것을 확인 했지만 매력처럼 작동합니다. @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) (저는 Spring 3.2.2에서 Jackson 1.9.12를 사용하고 있습니다.)
gstroup

17
@MartinAsenov-답변은 최신 API를 보여줍니다. @JsonSerialize구문 에서로 변경되었습니다 @JsonInclude. 이전 구문은 더 이상 사용되지 않습니다.
Logan Pickup

128

Jackson> 1.9.11 및 <2.x에서는 @JsonSerialize주석을 사용 하여 다음을 수행하십시오.

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)


10
요즘 (Jackson 2.x)이 방법은 더 이상 사용되지 않습니다.
rustyx

39
@JsonInclude (JsonInclude.Include.NON_NULL)
ZiglioUK

3
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL)작동하지 않습니다. 널 입력 가능 값이 직렬화됩니다.
herau

1
더 이상 사용되지 않지만 오래된 내용을 유지 해야하는 경우이 대답은 완전히 좋습니다! @WTK 감사합니다 :)
DominikAngerer

사이드 참고로, 잭슨 1.9.12는 희망이 정보는이 밖으로 :-) 내기 위해 나를 데려 다른 사람에게 많은 시간을 절약 할 수는 WebSphere 8.5의 표준
bakoyaro

122

다른 답변을 확장하기 위해-필드별로 null 값 생략을 제어 해야하는 경우 해당 필드에 주석을 추가하십시오 (또는 필드의 'getter'에 주석을 달으십시오).

예- 여기서는 fieldOnenull 인 경우 에만 json에서 생략됩니다. fieldTwonull인지 여부에 관계없이 항상 포함됩니다.

public class Foo {

    @JsonInclude(JsonInclude.Include.NON_NULL) 
    private String fieldOne;

    private String fieldTwo;
}

클래스의 모든 null 값을 기본값으로 생략하려면 클래스에 주석을 답니다. 필요한 경우 필드 별 / 게터 주석을 사용하여이 기본값을 무시할 수 있습니다.

예 - 여기 fieldOnefieldTwo그들이 각각 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 주석을 지적했습니다!


필드의 주석을 항상 무시해서는 안됩니까?
Abhinav Vishak

@AbhinavVishak 당신이 맞아요-감사합니다! Jackson 2를 사용하도록 답변을 업데이트했을 때 복사 붙여 넣기 오타였습니다. 편집했습니다.
davnicwil

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 더 이상 사용되지 않습니다
Yar

1
@Yar 예, Jackson 2.x에서는 더 이상 사용되지 않습니다. 나는 당신이 만입니다뿐만 아니라 잭슨 이전 버전의 것을 사용할 필요가 있음을 언급 한 적이 없는 이 유일한 옵션이다, 추천하지 않습니다.
davnicwil

60

Jackson 2.x에서 다음을 사용하십시오.

@JsonInclude(JsonInclude.Include.NON_NULL)

이 필드에 배치됩니다.
ams

1
@ams,이 주석은 클래스를 래퍼해야합니다
Edgard Leal

정규화 된 이름도 포함시킬 수 있습니까? Jackson은 이름과 패키지가 다른 여러 주석이 있으므로 모호합니다.
빈스

Jackson에 @JsonInclude 주석이 여러 개 있다고 말하고 있습니까? 나는 몰랐다. 그러면 정규화 된 이름은 무엇입니까? 답변을 자유롭게 편집하십시오
ZiglioUK

이름과 혼동하는 것은 클래스 로더 충돌을 피하기 위해 모든 것에 대해 다른 Java 패키지를 사용하는 Jackson 1.x 및 2.x 때문일 가능성이 높습니다 (클래스 호환되지 않는 클래스 버전). 이 답변은 2.x이므로 주석 패키지는 다음과 같습니다. com.fasterxml.jackson.annotationJackson 1.x는org.codehaus.jackson.annoation
StaxMan

39

다음과 같은 매퍼 구성을 사용할 수 있습니다.

mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);

2.5 이후로 다음을 수행 할 수 있습니다.

mapper.setSerializationInclusion(Include.NON_NULL);

3
이것은 1.9에서 더 이상 사용되지 않으므로 mapper.getSerializationConfig (). withSerializationInclusion (JsonSerialize.Inclusion.NON_NULL);
Asa

7
.. 또는 직접 : mapper.setSerializationInclusion (NON_NULL);
Asa

@ruslan : 아마도 다음과 같은 문서가 있기 때문일 것입니다 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.
Zero3

2.5.4 사용을 위해mapper.setSerializationInclusion(Include.NON_NULL);
Arturo Volpe


12

나의 경우에는

@JsonInclude(Include.NON_EMPTY)

작동하게 만들었습니다.


2
NON_EMPTY는 NON_NULL과 미묘한 차이가 있습니다. null 값은 무시하지만 사실이지만 비어있는 것으로 간주되는 값 무시하므로 원하는 동작이 아닐 수 있습니다. 잭슨의 참조 의 javadoc을 추가 정보를 원하시면
davnicwil

실제로 선택적인 것에서 Optional을 반환하는 것이 좋은 생각이므로 NON_NULL 만 있으면 { }null 과 같은 것을 얻을 수 있으므로 Java 관용구를 소비자에게 무의미하게 전송합니다. 소비자는 AtomicReference와 동일합니다. 소비자는 개발자가 응답의 내부 표현에 스레드 안전성을 적용하기로 선택한 방식에 신경 쓰지 않습니다.
Lucas Ross

8
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)

작동해야합니다.

Include.NON_EMPTY값이 null이 아니고 비어 있지 않은 경우 속성이 직렬화됨을 나타냅니다. Include.NON_NULL값이 null이 아닌 경우 속성이 직렬화됨을 나타냅니다.


2
JsonInclude.Include.NON_EMPTYNOT_NULL 사례를 다루기 때문에 충분합니다
Ilya Buziuk

5

Jackson 2.6+의 모든 모델에이 규칙을 추가하려면 다음을 사용하십시오.

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);


5

이것은 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
}

1
같은 그건 @JsonInclude(JsonInclude.Include.NON_NULL)나를 위해 일한 봄 2.1.2를 부팅 하고 잭슨 2.9.0 주석을
manasouza

@manasouza 예, 모든 업데이트에 대한 일관성을 유지했습니다.
Deva


2

이것은 꽤 오랫동안 나를 괴롭 히고 있었고 마침내 문제를 발견했습니다. 가져 오기가 잘못되어 문제가 발생했습니다. 내가 사용했던 이전

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)

2

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

}

serializationInclusion을 설정해도 서로 추가되지는 않습니다. public Jackson2ObjectMapperBuilder serializationInclusion(JsonInclude.Include serializationInclusion) { this.serializationInclusion = serializationInclusion; return this; }; 더 큰 포함 반경을 사용해야합니다. 예를 들어 NON_ABSENT는 NON_NULL을 포함하고 NON_EMPTY는 둘 다를 포함합니다. 따라서 그것은 단지해야 builder.serializationInclusion(JsonInclude.Include.NON_EMPTY); JacksonInclude의 문서를
Olgun 가야

2

객체 목록을 직렬화하려고 시도하고 그중 하나가 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()


1

이 질문에 대한 답변이 많이 있습니다. 이 답변은 일부 시나리오에서 도움이 될 수 있습니다. null 값을 무시하려면 클래스 수준에서 NOT_NULL을 사용할 수 있습니다. 아래

@JsonInclude(Include.NON_NULL)
class Foo
{
  String bar;
}

때로는 arrayList를 초기화했을 때와 같이 빈 값을 무시해야 할 수도 있지만 해당 목록에 요소가 없습니다. 그 당시 NOT_EMPTY 주석을 사용하여 빈 값 필드를 무시하십시오.

@JsonInclude(Include.NON_EMPTY)
class Foo
{
  String bar;
}

0

Jackson 2.x + 사용

mapper.getSerializationConfig().withSerializationInclusion(JsonInclude.Include.NON_NULL);

.withSerializationInclusion(JsonInclude.Include.NON_NULL)대신 맞습니까?
herau

지적 해 주셔서 감사합니다. 업그레이드를 중단
하겠습니다

@ruslan : 아마도 다음과 같은 문서가 있기 때문일 것입니다 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.
Zero3

0

또한 널을 줄이려면 문서에 설명 된대로 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

0

사례 하나

@JsonInclude(JsonInclude.Include.NON_NULL)
private String someString;

사례 2

@JsonInclude(JsonInclude.Include.NON_EMPTY)
private String someString;

someStringnull 인 경우 , 두 경우 모두 무시됩니다. 만약someString "입니다"그것은 단지 경우에만이 무시 될 수있다.

의 동일 List = null또는List.size() = 0

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.