回答:
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を通じてシリアル化されないようにする方法に対する私の回答にあります。
@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許容値はシリアル化されます。
他の答えを拡張するために-フィールドごとにnull値の省略を制御する必要がある場合は、問題のフィールドに注釈を付けます(またはフィールドの「getter」に注釈を付けます)。
例fieldOne
-nullの場合、ここではjsonからのみ省略されます。fieldTwo
nullかどうかに関係なく常に含まれます。
public class Foo {
@JsonInclude(JsonInclude.Include.NON_NULL)
private String fieldOne;
private String fieldTwo;
}
デフォルトでクラスのすべてのnull値を省略するには、クラスに注釈を付けます。フィールドごと/ getterアノテーションは、必要に応じてこのデフォルトをオーバーライドするために引き続き使用できます。
例-ここ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;
}
更新
上記はジャクソン2用です。以下のために以前のバージョンジャクソンのあなたが使用する必要があります。
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
の代わりに
@JsonInclude(JsonInclude.Include.NON_NULL)
この更新が有用な場合は、以下のZiglioUKの回答に賛成投票してください。使用するように回答を更新するずっと前に、新しいJackson 2アノテーションが指摘されていました。
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
廃止予定
ジャクソン2.xでは、以下を使用します。
@JsonInclude(JsonInclude.Include.NON_NULL)
com.fasterxml.jackson.annotation
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と同じです。コンシューマは、開発者が応答の内部表現にスレッドセーフティを適用する方法を気にしていません。
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
これは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)
ことがSpring boot 2.1.2とJacksonアノテーション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ドキュメント
オブジェクトのリストをシリアル化しようとしていて、そのうちの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()
この質問に対する答えはたくさんあります。この回答は、いくつかのシナリオで役立つ場合があります。null値を無視する場合は、クラスレベルでNOT_NULLを使用できます。以下のように
@JsonInclude(Include.NON_NULL)
class Foo
{
String bar;
}
arrayListを初期化したが、そのリストに要素がない場合など、空の値を無視する必要がある場合があります。そのときは、NOT_EMPTYアノテーションを使用して空の値フィールドを無視します。
@JsonInclude(Include.NON_EMPTY)
class Foo
{
String bar;
}
ジャクソン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.
また、ドキュメントで説明されているように、マップ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
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
; どういうわけかあなたの注釈は利用できませんでした。