値がnullの場合、シリアル化中にフィールドを無視するようにJacksonに指示するにはどうすればよいですか?


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で使用することもできます。

より完全な例は、Map内のnull値とBean内のnullフィールドがJacksonを通じてシリアル化されないようにする方法に対する私の回答あります


81
私のプロジェクトのために、これは働きました:@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL); どういうわけかあなたの注釈は利用できませんでした。
Emmanuel Touzery 2013年

13
APIは2.0リリースで少し変更されました。
プログラマBruce

10
@ProgrammerBruce -1変更を認識しているため、それに応じて回答を変更します。
Martin Asenov 2013

19
ええ、私はこの@JsonInclude表記が機能しないことを確認しましたが、これは魅力のように機能します:(@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 私は、Spring 3.2.2でJackson 1.9.12を使用しています。)
gstroup

17
@MartinAsenov-答えは最新のAPIを示しています。@JsonSerialize構文からに変更されました@JsonInclude。古い構文は非推奨です。
ローガンピックアップ

128

Jackson> 1.9.11および<2.xでは、@JsonSerialize注釈を使用してそれを行います。

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)


10
今日(Jackson 2.x)はこのアプローチが非推奨です。
rustyx 2013年

39
@JsonInclude(JsonInclude.Include.NON_NULL)
ZiglioUK 2014年

3
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL)動作しません。null許容値はシリアル化されます。
herau 2014年

1
それは非推奨ですが、古いものを維持する必要がある場合、この答えはまったく問題ありません!@WTKに感謝します:)
DominikAngerer 2015年

補足として、Jackson 1.9.12はWebSphere 8.5の標準です。この情報により、誰かがこれを理解するのにかかる時間を大幅に節約できれば幸いです:-)
bakoyaro

122

他の答えを拡張するために-フィールドごとにnull値の省略を制御する必要がある場合は、問題のフィールドに注釈を付けます(またはフィールドの「getter」に注釈を付けます)。

fieldOne -nullの場合、ここではjsonからのみ省略されます。fieldTwonullかどうかに関係なく常に含まれます。

public class Foo {

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

    private String fieldTwo;
}

デフォルトでクラスのすべてのnull値を省略するには、クラスに注釈を付けます。フィールドごと/ getterアノテーションは、必要に応じてこのデフォルトをオーバーライドするために引き続き使用できます。

例-ここfieldOnefieldTwoは、nullの場合はそれぞれjsonから省略されます。これは、クラスアノテーションによってデフォルトで設定されるためです。fieldThreeただし、フィールドの注釈のために、デフォルトをオーバーライドし、常に含まれます。

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Foo {

    private String fieldOne;

    private String fieldTwo;

    @JsonInclude(JsonInclude.Include.ALWAYS)
    private String fieldThree;
}

更新

上記はジャクソン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
@はいはい、それはジャクソン2.xで非推奨です。以前のバージョンのジャクソンでのみ使用する必要があると述べましたが非推奨ではなく、唯一のオプションです。
davnicwil 2018

60

ジャクソン2.xでは、以下を使用します。

@JsonInclude(JsonInclude.Include.NON_NULL)

これはフィールドに配置されます。
ams

1
@ams、このアノテーションはクラスをラップする必要があります
Edgard Leal

完全修飾名も含めることができますか?ジャクソンには同じ名前と異なるパッケージを持つ複数の注釈があるため、あいまいです。
Vince

ジャクソンに複数の@JsonIncludeアノテーションがあると言っていますか?私は今まで知らなかった。では、完全修飾名はどうあるべきでしょうか?回答を自由に編集してください
ZiglioUK

名前の混乱は、クラスローダーの競合(互換性のないクラスバージョンを記述)を回避するために、Jackson 1.xおよび2.xがすべてに異なるJavaパッケージを使用していることが原因と考えられます。この答えは2.xのため、注釈用のパッケージはcom.fasterxml.jackson.annotationorg.codehaus.jackson.annoation
-Jackson

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値を無視します。これはtrueですが、空と見なされる値無視するため、望ましい動作ではない可能性があります。ジャクソンを参照してください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_EMPTY
-NOT_NULL

5

このルールをジャクソン2.6以降のすべてのモデルに追加する場合は、以下を使用します。

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

5

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

詳細:https : //docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper


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)ことがSpring boot 2.1.2Jacksonアノテーション2.9.0
うまくいった

@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 Kaya

2

オブジェクトのリストをシリアル化しようとしていて、そのうちの1つが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

ジャクソン2.x +の使用

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

.withSerializationInclusion(JsonInclude.Include.NON_NULL)代わりに正しいですか?
herau 2014年

それを指摘してくれてありがとう、私はアップグレードを
控えるつもりです

@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

また、ドキュメントで説明されているように、マップmyVariableを使用してnullを除去する場合は、アプローチを変更する必要があります。

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

ケース1

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

ケース2

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

場合はsomeStringnullで、これは例の両方に無視されます。someStringが ""の場合は、ケース2でのみ無視されます。

List = nullまたは同じList.size() = 0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.