जैक्सन को धारावाहिकीकरण के दौरान किसी क्षेत्र की उपेक्षा करने के लिए कैसे कहें यदि इसका मूल्य शून्य है?


687

जैक्सन को क्रमांकन के दौरान फ़ील्ड मान को अनदेखा करने के लिए कैसे कॉन्फ़िगर किया जा सकता है यदि उस फ़ील्ड का मान शून्य है।

उदाहरण के लिए:

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

जैक्सन> 2.0 का उपयोग करते हुए अशक्त मूल्यों के साथ क्रमबद्ध गुणों को दबाने के लिए, आप सीधे कॉन्फ़िगरObjectMapper कर सकते हैं , या @JsonIncludeएनोटेशन का उपयोग कर सकते हैं :

mapper.setSerializationInclusion(Include.NON_NULL);

या:

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

वैकल्पिक रूप से, आप उपयोग कर सकते हैं @JsonInclude एक गटर में ताकि मूल्य शून्य होने पर विशेषता दिखाई जाए।

मेरे उत्तर में एक अधिक संपूर्ण उदाहरण उपलब्ध है कैसे एक मैप के अंदर अशक्त मूल्यों को रोकने के लिए और जैक्सन के बिना धारावाहिक से एक सेम के अंदर अशक्त क्षेत्रों को रोका जाए


81
मेरी परियोजना के लिए, यह काम किया @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL):; किसी तरह आपका एनोटेशन उपलब्ध नहीं था।
इमैनुएल टाउज़री

13
2.0 रिलीज के साथ एपीआई थोड़ा बदल गया।
प्रोग्रामर ब्रूस

11
@ProgrammerBruce -1 अपने उत्तर को तदनुसार बदलें क्योंकि आप परिवर्तन से अवगत हैं।
मार्टिन असेनोव

19
हाँ, मैंने अभी पुष्टि की है कि @JsonIncludeसंकेतन काम नहीं करता है, लेकिन यह एक आकर्षण की तरह काम करता है: @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) (मैं वसंत 3.2.2 के साथ जैक्सन 1.9.12 का उपयोग कर रहा हूं।)
gstroup

17
@MartinAsenov - उत्तर सबसे हालिया एपीआई दिखाता है; इसे @JsonSerializeसिंटैक्स से बदल दिया गया था @JsonInclude। पुराने सिंटेक्स को हटा दिया जाता है।
लोगन पिकअप

128

जैक्सन के साथ 1.9.11 और <2.x का उपयोग @JsonSerializeएनोटेशन करने के लिए करते हैं:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)


10
आजकल (जैक्सन 2.x) इस दृष्टिकोण को पदावनत किया जाता है।
रस्टीक्स

39
@JsonInclude (JsonInclude.Include.NON_NULL)
ज़िगलियोकुक

3
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL)काम नहीं करता है। अशक्त मूल्य क्रमबद्ध हैं।
हरौ 12

1
यह पदावनत है लेकिन अगर आपको पुराने सामान को बनाए रखने की आवश्यकता है तो यह उत्तर पूरी तरह से ठीक है! so Thanks @WTK :)
डोमिनिकअनर

एक साइड नोट के रूप में, जैक्सन 1.9.12, वेबस्फेयर 8.5 में मानक है, उम्मीद है कि यह जानकारी किसी और व्यक्ति को बचाने में बहुत समय
लगाएगी क्योंकि

122

बस अन्य उत्तरों पर विस्तार करने के लिए - यदि आपको प्रति-फ़ील्ड आधार पर शून्य मानों की चूक को नियंत्रित करने की आवश्यकता है, तो प्रश्न में फ़ील्ड को एनोटेट करें (या वैकल्पिक रूप से फ़ील्ड के 'गेट्टर' को एनोटेट करें)।

उदाहरण - यहाँ केवल fieldOneजुबान से ommitted किया जाएगा यदि यह अशक्त है। fieldTwoहमेशा की परवाह किए बिना शामिल किया जाएगा अगर यह शून्य है।

public class Foo {

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

    private String fieldTwo;
}

एक डिफ़ॉल्ट के रूप में कक्षा में सभी अशक्त मूल्यों को छोड़ने के लिए, वर्ग को एनोटेट करें। यदि आवश्यक हो तो इस डिफ़ॉल्ट को ओवरराइड करने के लिए प्रति-फ़ील्ड / गेट्टर एनोटेशन का उपयोग किया जा सकता है।

उदाहरण - यहाँ fieldOneऔर fieldTwoअगर वे क्रमशः अशक्त हैं, तो उन्हें 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 के उत्तर को बढ़ाएं, इसने नए जैक्सन 2 एनोटेशन को इंगित किया, इससे पहले कि मैंने इसका उपयोग करने के लिए अपना उत्तर अपडेट किया!


ओवरराइड करने के लिए मैदान पर एनोटेशन नहीं होना चाहिए?
अभिनव विशाख

@AbhinavVishak आप सही हैं - धन्यवाद! यह एक कॉपी-पेस्ट टाइपो था जब मैंने जैक्सन 2 का उपयोग करने का उत्तर अपडेट किया था। संपादित।
डेवनीविल

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) पदावनत किया जाता है
यार

1
@ यार, कि जैक्सन में पदावनत है 2.x। मैं ने कहा है कि आप का उपयोग करने के कि केवल जैक्सन के पुराने संस्करणों जहां न केवल यह है की जरूरत नहीं पदावनत, यह ही एकमात्र विकल्प है।
davnicwil

60

जैक्सन में 2.x, का उपयोग करें:

@JsonInclude(JsonInclude.Include.NON_NULL)

क्या इसे मैदान पर रखा जाएगा।
आम

1
@ एम्स, इस एनोटेशन को एक वर्ग को कवर करना चाहिए
एडगार्ड लील

क्या आप पूरी तरह से योग्य नाम भी शामिल कर सकते हैं? जैक्सन के पास एक ही नाम और एक अलग पैकेज के साथ कई एनोटेशन हैं, इसलिए यह अस्पष्ट है।
विंस

क्या आप कह रहे हैं कि जैक्सन में कई @JsonInclude एनोटेशन हैं? मुझे पता नहीं था। तब पूरी तरह से योग्य नाम क्या होना चाहिए? जवाब को संपादित करने के लिए स्वतंत्र महसूस करें
ZiglioUK

जैक्सन 1.x और 2.x के कारण नामों के साथ भ्रम की संभावना सबसे अधिक है, हर चीज के लिए अलग-अलग जावा पैकेज का उपयोग करते हुए, क्लास लोडर संघर्षों (wrt असंगत वर्ग संस्करणों) से बचने के लिए। चूंकि यह उत्तर 2.x के लिए है, एनोटेशन के लिए पैकेज होगा com.fasterxml.jackson.annotation- जैक्सन 1.x थाorg.codehaus.jackson.annoation
StaxMan

39

आप निम्न मैपर कॉन्फ़िगरेशन का उपयोग कर सकते हैं:

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

2.5 के बाद से आप उपयोगकर्ता कर सकते हैं:

mapper.setSerializationInclusion(Include.NON_NULL);

3
चूंकि यह 1.9 में पदावनत है, mapper.getSerializationConfig () का उपयोग करें। withSerializationInclusion (JsonSerialize.Inclusion.NON_NULL);
आसा

7
..या सीधे: mapper.setSerializationInclusion (NON_NULL);
आसा

@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 से बिलकुल अलग है - यह शून्य मानों को अनदेखा करेगा, यह सच है, लेकिन खाली समझे जाने वाले मूल्यों को भी अनदेखा करेगा , जो कि वांछित व्यवहार नहीं हो सकता है। अधिक जानकारी के लिए जैक्सन javadocs देखें
davnicwil

मुझे यह उत्तर पसंद है क्योंकि वैकल्पिक रूप से उन चीजों से लौटना जो वास्तव में वैकल्पिक हैं एक अच्छा विचार है, और सिर्फ NON_NULL के साथ आपको { }अशक्त के लिए कुछ ऐसा मिलेगा , जो उपभोक्ता के लिए जावा मुहावरे को इंगित करता है। AtomicReference के साथ भी - उपभोक्ता को परवाह नहीं है कि डेवलपर ने प्रतिक्रिया के आंतरिक प्रतिनिधित्व पर थ्रेड सुरक्षा को लागू करने के लिए कैसे चुना।
लुकास रॉस

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

कार्य करना चाहिए।

Include.NON_EMPTYइंगित करता है कि संपत्ति को क्रमबद्ध किया गया है यदि उसका मूल्य शून्य नहीं है और खाली नहीं है। Include.NON_NULLसंकेत करता है कि यदि संपत्ति का मूल्य कम है, तो उसे अनुक्रमित किया जाता है।


2
JsonInclude.Include.NON_EMPTY- यह पर्याप्त नहीं है क्योंकि इसमें NOT_NULL मामला शामिल है
Ilya Buziuk

5

यदि आप जैक्सन 2.6+ में सभी मॉडलों में इस नियम को जोड़ना चाहते हैं:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

5

यदि स्प्रिंग बूट में , आप जैकसन को अनुकूलित कर सकते हैं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-obitmapper


5

यह स्प्रिंग स्प्रिंग 2.0.3+ और जैक्सन 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)ने मेरे लिए स्प्रिंग बूट 2.1.2 और जैक्सन एनोटेशन 2.9.0
मनसौज़ा

@manasouza हां, उन्होंने सभी अपडेट के लिए निरंतरता बनाए रखी है।
देवा


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

वैश्विक विन्यास यदि आप स्प्रिंग का उपयोग करते हैं

@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); जैक्सनInclude डॉक्टर
काया

2

यदि आप ऑब्जेक्ट की एक सूची को क्रमबद्ध करने की कोशिश कर रहे हैं और उनमें से एक शून्य है, तो आप इसे JAIL में भी शून्य आइटम सहित समाप्त कर देंगे

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

TIP: यदि आप DropWizard का उपयोग कर रहे हैं, तो आप ObjectMapperजर्सी द्वारा उपयोग किए जा रहे उपयोग को पुनः प्राप्त कर सकते हैंenvironment.getObjectMapper()


1

हमारे पास इस प्रश्न के बहुत से उत्तर हैं। यह उत्तर कुछ परिदृश्यों में मददगार हो सकता है। यदि आप अशक्त मूल्यों को अनदेखा करना चाहते हैं तो आप कक्षा स्तर में NOT_NULL का उपयोग कर सकते हैं। नीचे के अनुसार

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

कुछ बार आपको खाली मानों को नजरअंदाज करने की आवश्यकता हो सकती है जैसे कि आपने सरणी सूची को प्रारंभ किया हो सकता है, लेकिन उस सूची में कोई तत्व नहीं हैं। उस समय में उन खाली मान फ़ील्ड को अनदेखा करने के लिए 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

यह इंगित करने के लिए धन्यवाद, मैं अपग्रेड करने से दूर
रहूंगा

@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 का उपयोग करते समय अपना दृष्टिकोण बदलना होगा जैसा कि दस्तावेज़ों में विवरण को शून्य करने के लिए वर्णित किया गया है:

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

केस एक

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

केस दो

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

यदि someStringअशक्त है, तो इसे दोनों मामलों पर ध्यान नहीं दिया जाएगा। अगर someString"" यह केवल मामले दो पर ध्यान नहीं दिया जाना चाहिए।

के लिए समान List = nullयाList.size() = 0

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.