web-dev-qa-db-ja.com

値がnullの場合、直列化中にフィールドを無視するようにJacksonに指示する方法

フィールドの値が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; 
}
611
ams

Jackson> 2.0を使ってnull値でプロパティを直列化しないようにするには、 ObjectMapperを直接設定 を使うか、または @JsonInclude アノテーションを使います。

mapper.setSerializationInclusion(Include.NON_NULL);

または

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

あるいは、値がnullでない場合に属性が表示されるように、ゲッターで@JsonIncludeを使用することもできます。

もっと完全な例は 私の答え から Mapの中のnull値とbeanの中のnullフィールドがJacksonを通して直列化されるのを防ぐ方法 で利用可能です。

996

Jackson> 1.9.11および<2.xでは、@JsonSerializeアノテーションを使用してそれを行います。

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

119
WTK

他の答えを詳しく説明すると、フィールドごとにnull値の省略を制御する必要がある場合は、問題のフィールドに注釈を付けます(またはフィールドの 'getter'に注釈を付けます)。

example - ここでfieldOneだけがnullの場合はjsonから除外されます。 fieldTwoは、nullであるかどうかにかかわらず、常に含まれます。

public class Foo {

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

    private String fieldTwo;
}

デフォルトでクラス内のすべてのNULL値を省略するには、クラスに注釈を付けます。必要に応じて、フィールドごと/ゲッターごとの注釈を使用してこのデフォルトをオーバーライドすることもできます。

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

_アップデート_

上記は Jackson 2 用です。 以前のバージョン Jacksonの場合は、使用する必要があります。

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 

の代わりに

@JsonInclude(JsonInclude.Include.NON_NULL)

もしこのアップデートが有用なら、ZiglioUKの答えを以下にアップグレードしてください。私が答えを更新するずっと前に、新しいJackson 2アノテーションを指摘しました!

110
davnicwil

Jackson 2.xでは、次のように使用します。

@JsonInclude(JsonInclude.Include.NON_NULL)
57
ZiglioUK

次のマッパー設定を使用できます。

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

2.5以降、あなたは次のことができます。

mapper.setSerializationInclusion(Include.NON_NULL);
35
Eren Yilmaz

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

17
Yury

私の場合

@JsonInclude(Include.NON_EMPTY)

うまくいった。

12
alfthan
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)

うまくいくはずです。

Include.NON_EMPTYは、その値がnullではなく、空でもない場合、プロパティがシリアル化されることを示します。 Include.NON_NULLは、値がnullではない場合、プロパティがシリアル化されていることを示します。

7
Neha Gangwar

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
acdcjunior

Jackson 2.6以降のすべてのモデルにこのルールを追加したい場合は、次のようにします。

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
5
Ilia Kurtov

これは 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
}
4
Deva

Jackson 2.5の場合:

@JsonInclude(content=Include.NON_NULL)
3
Bilal BBB

オブジェクトのリストをシリアル化しようとしていて、それらの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を使用している場合は、environment.getObjectMapper()を使用してJerseyで使用されているObjectMapperを取得できます。

2
user3474985

これはかなり長い間私を悩ませてきた、そして私はついに問題を発見した。問題は間違ったインポートによるものです。以前使っていた

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
user3443646

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

}
2
Xelian

ジャクソン2.x +用

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

また、ドキュメントに記述されているようにMap 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
atom88