フィールドの値が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;
}
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を通して直列化されるのを防ぐ方法 で利用可能です。
Jackson> 1.9.11および<2.xでは、@JsonSerialize
アノテーションを使用してそれを行います。
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
他の答えを詳しく説明すると、フィールドごとに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 fieldOne
とfieldTwo
は、それぞれ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アノテーションを指摘しました!
Jackson 2.xでは、次のように使用します。
@JsonInclude(JsonInclude.Include.NON_NULL)
次のマッパー設定を使用できます。
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
2.5以降、あなたは次のことができます。
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)
うまくいった。
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
うまくいくはずです。
Include.NON_EMPTY
は、その値がnullではなく、空でもない場合、プロパティがシリアル化されることを示します。 Include.NON_NULL
は、値が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
Jackson 2.6以降のすべてのモデルにこのルールを追加したい場合は、次のようにします。
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
これは 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
}
Jackson 2.5の場合:
@JsonInclude(content=Include.NON_NULL)
オブジェクトのリストをシリアル化しようとしていて、それらの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を取得できます。
これはかなり長い間私を悩ませてきた、そして私はついに問題を発見した。問題は間違ったインポートによるものです。以前使っていた
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;
}
}
ジャクソン2.x +用
mapper.getSerializationConfig().withSerializationInclusion(JsonInclude.Include.NON_NULL);
また、ドキュメントに記述されているように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