Jackson'a, değeri boşsa serileştirme sırasında bir alanı yoksaymasını nasıl söyleyebilirim?


687

Jackson, bu alanın değeri null olduğunda serileştirme sırasında bir alan değerini yok sayacak şekilde nasıl yapılandırılabilir.

Örneğin:

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

Yanıtlar:


1102

Jackson> 2.0 kullanarak null değerlerle serileştirme özelliklerini bastırmak için ObjectMapperdoğrudan yapılandırabilir veya @JsonIncludeek açıklamadan yararlanabilirsiniz:

mapper.setSerializationInclusion(Include.NON_NULL);

veya:

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

Alternatif olarak, @JsonInclude değer boş değilse özniteliğin gösterilmesi için bir alıcıda .

Daha kapsamlı bir örnek mevcuttur cevabım için Jackson aracılığıyla tefrika alma bir fasulye içinde bir harita içindeki boş değerler ve boş alanları nasıl engellenir .


81
projem için bu işe yaradı @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL):; bir şekilde ek açıklamanız mevcut değildi.
Emmanuel Touzery

13
2.0 sürümünde API biraz değişti.
Programcı Bruce

11
@ProgrammerBruce -1 değişikliğin farkında olduğunuzdan cevabınızı buna göre değiştirin.
Martin Asenov

19
Evet, @JsonIncludegösterimin işe yaramadığını doğruladım , ancak bu bir cazibe gibi çalışıyor: @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) (Jackson 3.2.12'yi Bahar 3.2.2 ile kullanıyorum.)
gstroup

17
@MartinAsenov - cevap en son API'yı gösterir; @JsonSerializesözdiziminden olarak değiştirildi @JsonInclude. Eski sözdizimi kullanımdan kaldırıldı.
Logan Pickup

128

Jackson> 1.9.11 ve <2.x @JsonSerializeile bunu yapmak için ek açıklama kullanın:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)


10
Günümüzde (Jackson 2.x) bu yaklaşım onaylanmamıştır.
rustyx

39
@JsonInclude (JsonInclude.Include.NON_NULL)
ZiglioUK

3
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL)çalışmıyor. sıfırlanabilir değerler serileştirilir.
herau

1
Kullanımdan kaldırıldı, ancak eski şeyleri korumanız gerekiyorsa bu cevap tamamen iyi! so thanks @WTK :)
DominikAngerer

Bir yan not olarak, Jackson 1.9.12, umarım bu bilgi bu out :-) anlamaya götürdü başkasına çok zaman kazandıracak WebSphere 8.5 standarttır
bakoyaro

122

Sadece diğer cevapları genişletmek için - alan başına boş değerlerin atlanmasını kontrol etmeniz gerekiyorsa, söz konusu alana açıklama ekleyin (veya alternatif olarak alanın 'alıcısına' açıklama ekleyin).

örnek - burada sadece fieldOneboşsa json'dan çıkarılır. fieldTwoboş olup olmadığına bakılmaksızın her zaman dahil edilecektir.

public class Foo {

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

    private String fieldTwo;
}

Sınıftaki tüm boş değerleri varsayılan olarak atlamak için sınıfa açıklama ekleyin. Gerekirse bu varsayılanı geçersiz kılmak için alan başına / alıcı ek açıklamaları kullanılabilir.

örnek - burada fieldOneve fieldTwosırasıyla boşsa json'dan çıkarılır, çünkü bu sınıf ek açıklaması tarafından ayarlanan varsayılan değerdir. fieldThreeancak, alandaki ek açıklama nedeniyle varsayılanı geçersiz kılar ve her zaman dahil edilir.

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

    private String fieldOne;

    private String fieldTwo;

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

GÜNCELLEME

Yukarıdaki Jackson 2 içindir . İçin önceki sürümleri Jackson sen kullanımına gerekir:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 

onun yerine

@JsonInclude(JsonInclude.Include.NON_NULL)

Bu güncelleme faydalıysa, lütfen aşağıdaki ZiglioUK'un cevabını onaylayın, kullanmak için cevabımı güncellemeden çok daha önce yeni Jackson 2 ek açıklamasına dikkat çekti!


alandaki ek açıklama DAİMA geçersiz kılmamalı mı?
Abhinav Vishak

@AbhinavVishak haklısın - teşekkürler! Jackson 2'yi kullanmak için cevabı güncellediğimde bir kopyala yapıştır yazım hatasıydı. Düzenlendi.
davnicwil

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) kullanımdan kaldırıldı
Yar

1
@Yar evet, bu Jackson 2.x'te kullanımdan kaldırıldı. Ben sadece o değil sadece Jackson önceki sürümlerinde bu kullanmak gerektiğini ifade ettik değil tek seçenek bu, kullanımdan kaldırıldı.
davnicwil

60

Jackson 2.x'te şunları kullanın:

@JsonInclude(JsonInclude.Include.NON_NULL)

bu sahaya yerleştirilecek.
AMS

1
@ ams, bu açıklama bir sınıfı sarmalı
Edgard Leal

Tam adı da ekleyebilir misiniz? Jackson'ın aynı isimde ve farklı bir pakette birden fazla ek açıklaması var, bu yüzden belirsiz.
Vince

Jackson'da birden fazla @JsonInclude ek açıklaması olduğunu mu söylüyorsun? Hiç bir fikrim yoktu. Tam adı ne olmalı? cevabı düzenlemek için çekinmeyin
ZiglioUK

İsimlerle karışıklık büyük olasılıkla, sınıf yükleyici çakışmalarını (uyumsuz sınıf sürümleri) önlemek için her şey için farklı Java paketleri kullanan Jackson 1.x ve 2.x'ten kaynaklanmaktadır. Bu cevap 2.x için olduğundan, ek açıklamalar paketi şu olurdu com.fasterxml.jackson.annotation- Jackson 1.xorg.codehaus.jackson.annoation
StaxMan

39

Aşağıdaki eşleyici yapılandırmasını kullanabilirsiniz:

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

2.5'ten beri şunları yapabilirsiniz:

mapper.setSerializationInclusion(Include.NON_NULL);

3
Bu, 1.9'da kullanımdan kaldırıldığı için mapper.getSerializationConfig (). İleSerializationInclusion (JsonSerialize.Inclusion.NON_NULL) kullanın;
Asa

7
..ya da doğrudan: mapper.setSerializationInclusion (NON_NULL);
Asa

@ruslan: Muhtemelen çünkü belgeleme getSerializationConfig() diyor ki: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.
Sıfır 3

2.5.4 kullanım içinmapper.setSerializationInclusion(Include.NON_NULL);
Arturo Volpe


12

benim durumumda

@JsonInclude(Include.NON_EMPTY)

işe yaradı.


2
NON_EMPTY, NON_NULL biçiminden ince bir şekilde farklıdır - null değerleri yok sayar, bu doğrudur, ancak boş olarak kabul edilen değerleri de yok sayar, bu da istenen davranış olmayabilir. Daha fazla bilgi için Jackson Javadocs'a bakın
davnicwil

i İsteğe bağlı gerçekten isteğe bağlı şeylerden isteğe bağlı döndürmek iyi bir fikirdir ve sadece NON_NULL ile { }null için bir şey alırsınız , hangi anlamsız bir Java deyim tüketiciye aktarır. AtomicReference ile aynı - tüketici, geliştiricinin yanıtın dahili gösterimi üzerinde iş parçacığı güvenliğini nasıl sağlamayı seçtiğini umursamıyor.
Lucas Ross

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

çalışmalı.

Include.NON_EMPTYdeğeri null değilse ve boş değilse, özelliğin serileştirildiğini belirtir. Include.NON_NULLdeğeri null değilse özelliğin serileştirildiğini belirtir.


2
JsonInclude.Include.NON_EMPTY- NOT_NULL davayı kapsadığı için yeterli
Ilya Buziuk

5

Bu kuralı Jackson 2.6 ve sonraki sürümlerindeki tüm modellere eklemek istiyorsanız şunu kullanın:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);


5

Bu Bahar önyükleme 2.0.3+ ve Jackson 2.0+

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiDTO
{
    // your class variable and 
    // methods
}

1
Aynı Yani @JsonInclude(JsonInclude.Include.NON_NULL)benim için çalıştı Bahar 2.1.2 önyükleme ve Jackson 2.9.0 ek notların
manasouza

@manasouza Evet, tüm güncellemelere tutarlılık sağladılar.
Deva


2

Bu oldukça uzun bir süredir beni rahatsız ediyor ve sonunda sorunu buldum. Sorun yanlış bir içe aktarmadan kaynaklandı. Daha önce kullanıyordum

com.fasterxml.jackson.databind.annotation.JsonSerialize

Hangi kullanımdan kaldırılmıştı. İçe aktarmayı şu şekilde değiştirin:

import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;

ve olarak kullan

@JsonSerialize(include=Inclusion.NON_NULL)

2

Spring kullanıyorsanız global yapılandırma

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

}

SerileştirmeInclusion ayarının yapılması birbiri üzerine ekleme yapmaz. public Jackson2ObjectMapperBuilder serializationInclusion(JsonInclude.Include serializationInclusion) { this.serializationInclusion = serializationInclusion; return this; }; Kişi daha geniş bir kapsama numaralandırma yarıçapı kullanmalıdır. örneğin NON_ABSENT NON_NULL içerir ve NON_EMPTY her ikisini de içerir. Bu yüzden sadece builder.serializationInclusion(JsonInclude.Include.NON_EMPTY); Jackson
Olgun Kaya

2

Bir nesne listesini serileştirmeye çalışıyorsanız ve bunlardan biri null değerindeyse, JSON'daki null öğeyi

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

sonuçlanacak:

[{myObject},null]

bunu elde etmek için:

[{myObject}]

biri gibi bir şey yapabilir:

mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
        @Override
        public void serialize(Object obj, JsonGenerator jsonGen, SerializerProvider unused)
                throws IOException
        {
            //IGNORES NULL VALUES!
        }
    });

İPUCU: DropWizard ObjectMapperkullanıyorsanız, Jersey tarafından kullanılmakta olanıenvironment.getObjectMapper()


1

Bu soruya çok yanıtımız var. Bu yanıt bazı senaryolarda yardımcı olabilir Null değerleri yoksaymak istiyorsanız NOT_NULL sınıf düzeyinde kullanabilirsiniz. aşağıda olduğu gibi

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

Bazı durumlarda arrayList'i başlatmış olabilirsiniz gibi boş değerleri yok saymanız gerekebilir, ancak bu listede hiçbir öğe yoktur.

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

0

Jackson 2.x + kullanımı

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

.withSerializationInclusion(JsonInclude.Include.NON_NULL)onun yerine değil mi?
herau

Bunu işaret ettiğiniz için teşekkürler, yükseltmeden
uzak duracağım

@ruslan: Muhtemelen çünkü belgeleme getSerializationConfig()diyor ki: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.
Sıfır 3

0

Ayrıca, null değerlerini ortadan kaldırmak için Map myVariable'ı belgelerde açıklandığı gibi kullanırken yaklaşımınızı değiştirmeniz gerekir:

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

Birinci durum

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

İkinci durum

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

Eğer someStringnull, bu durumların her ikisinde üzerinde dikkate alınmayacaktır. someString"" İse , yalnızca ikinci durumda göz ardı edilir.

Aynı List = nullveyaList.size() = 0

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.