জ্যাকসনকে সিরিয়ালাইজেশনের সময় কোনও ক্ষেত্রের মান শূন্য হলে তা উপেক্ষা করতে কীভাবে বলবেন?


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

জ্যাকসন> ২.০ ব্যবহার করে নাল মান সহ সিরিয়ালাইজিং বৈশিষ্ট্যগুলি দমন করতে, আপনি সরাসরি কনফিগার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
@ প্রোগ্রামার ব্রুস -১ আপনার উত্তরটি পরিবর্তন করুন যেহেতু আপনি পরিবর্তনটি সম্পর্কে অবগত রয়েছেন।
মার্টিন আসনভ

19
হ্যাঁ, আমি কেবল নিশ্চিত করেছি যে @JsonIncludeস্বরলিপিটি কাজ করে না, তবে এটি একটি @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) কবজির মতো কাজ করে: (আমি স্প্রিংয়ের ৩.২.২ সহ জ্যাকসন ১.৯.১২ ব্যবহার করছি।)
২২:০৪ এ জাস্ট্রপ

17
@ মার্টিনএসেনভ - উত্তরটি সাম্প্রতিকতম এপিআই দেখায়; এটি @JsonSerializeসিনট্যাক্স থেকে পরিবর্তিত হয়েছিল @JsonInclude। পুরানো বাক্য বাক্যটি হ্রাস করা হয়েছে।
লোগান পিকআপ

128

জ্যাকসন> 1.9.11 এবং <2.x এর সাথে @JsonSerializeটীকাটি ব্যবহার করুন :

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)


10
আজকাল (জ্যাকসন ২.x) এই পদ্ধতির অবমূল্যায়ন করা হয়েছে।
rustyx

39
@ জসনআইনক্লুড (জসনআইনক্লুড। ইনক্লুড। নন_নুল)
জিগ্লিউইউ

3
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL)কাজ করে না অযোগ্য মানগুলি ক্রমিকায়িত হয়।
হেরাউ

1
এটি অবচয় করা হয়েছে তবে আপনার যদি পুরানো জিনিসগুলি বজায় রাখতে হয় তবে এই উত্তরটি পুরোপুরি ঠিক আছে! তাই ধন্যবাদ @WTK :)
ডোমিনিকএঞ্জারার

পার্শ্ব দ্রষ্টব্য হিসাবে, জ্যাকসন ১.৯.১২ ওয়েবস্পিয়ার ৮.৫-তে স্ট্যান্ডার্ড, আশা করি এই তথ্যটি অন্য কারও অনেক সময় সাশ্রয় করবে যে এটি বের করতে আমার সময় লেগেছে :-)
বকোয়ারো

122

কেবলমাত্র অন্য উত্তরের জন্য প্রসারিত করতে - যদি আপনাকে প্রতি ক্ষেত্র ভিত্তিতে নাল মান বাদ দেওয়া নিয়ন্ত্রণ করতে হয় তবে ক্ষেত্রটি প্রশ্নে মন্তব্য করুন (অথবা বিকল্পভাবে ক্ষেত্রের 'গেটর' এনেটেট করুন)।

উদাহরণস্বরূপ - এখানে কেবল fieldOneজসন থেকে বাদ দেওয়া হবে যদি এটি শূন্য হয়। fieldTwoএটি বাতিল হলে নির্বিশেষে সর্বদা এতে অন্তর্ভুক্ত থাকবে।

public class Foo {

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

    private String fieldTwo;
}

ক্লাসের সমস্ত নাল মানকে ডিফল্ট হিসাবে বাদ দিতে ক্লাসটি টীকায় দিন। প্রয়োজন অনুসারে এই ডিফল্টটিকে ওভাররাইড করতে প্রতি ফিল্ড / গেটর টীকা এখনও ব্যবহার করা যেতে পারে।

উদাহরণস্বরূপ - এখানে fieldOneএবং fieldTwoজেসন থেকে বাদ পড়বে যদি তারা যথাক্রমে নাল হয় তবে এটি ক্লাস টিকা দ্বারা সেট করা ডিফল্ট। 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 টি টীকাটি এটি ব্যবহার করার জন্য আমার উত্তরটি আপডেট করার অনেক আগে চিহ্নিত করেছে!


মাঠে টীকাটি সর্বদা ওভাররাইড করা উচিত নয়?
অভিনব বিশ্বক

@ অভিনববিশাক আপনি ঠিক বলেছেন - ধন্যবাদ! আমি যখন জ্যাকসন ২ ব্যবহার করার উত্তর আপডেট করেছিলাম তখন এটি একটি অনুলিপি-পেস্ট টাইপ ছিল।
davnicwil

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) অবচয় করা হয়েছে
ইয়ার

1
@ ইয়ার হ্যাঁ, এটি জ্যাকসন ২.x এ অবমূল্যায়ন করা হয়েছে। আমি বলেছি যে আপনার কেবল জ্যাকসনের পূর্ববর্তী সংস্করণগুলিতে এটি ব্যবহার করা দরকার যেখানে এটি কেবল অবচয় নয় , এটিই একমাত্র বিকল্প।
davnicwil

60

জ্যাকসন ২.x এ, ব্যবহার করুন:

@JsonInclude(JsonInclude.Include.NON_NULL)

এই কি মাঠে রাখা হবে।
এএমএস

1
@ হ্যাঁ, এই টীকাটি একটি শ্রেণি আবৃত করবে
এডগার্ড

আপনি কি পুরোপুরি যোগ্যতাসম্পন্ন নাম অন্তর্ভুক্ত করতে পারেন? জ্যাকসনের একই নাম এবং একটি পৃথক প্যাকেজ সহ একাধিক টীকাগুলি রয়েছে, সুতরাং এটি অস্পষ্ট।
ভিনস

আপনি কি বলছেন যে জ্যাকসনে একাধিক @ জসনআইনোটোটেশন আছে? আমার কোন ধারণা ছিল না. পুরোপুরি যোগ্য নামটি তখন কী হওয়া উচিত? উত্তরটি সম্পাদন করতে দ্বিধা বোধ করুন
ZiglioUK

শ্রেণীর লোডার সংঘাত এড়াতে (আর্ট বেমানান শ্রেণির সংস্করণ) জ্যাকসন ১.x এবং ২.x সমস্ত কিছুর জন্য বিভিন্ন জাভা প্যাকেজ ব্যবহার করার কারণে নামগুলির সাথে বিভ্রান্তি সম্ভবত। যেহেতু এই উত্তরটি ২.x এর জন্য, টীকাগুলির জন্য প্যাকেজটি হ'ল com.fasterxml.jackson.annotation- জ্যাকসন ১.x এর ছিলorg.codehaus.jackson.annoation
স্ট্যাক্সম্যান

39

আপনি নিম্নলিখিত ম্যাপার কনফিগারেশন ব্যবহার করতে পারেন:

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

2.5 থেকে আপনি ব্যবহারকারী করতে পারেন:

mapper.setSerializationInclusion(Include.NON_NULL);

3
যেহেতু এটি ১.৯-এ অবহিত করা হয়েছে, তাই ম্যাসিপার.জিটআরশায়ালাইজেশন কনফিগ () ব্যবহার করুন শেরিয়ালাইজেশন ইনক্লুয়েন্সেশন (জসনসরিয়ালাইজ.আইঙ্কেলেশন.নোন_নুল);
আসা

7
.. অথবা সরাসরি: ম্যাপার.সেটসরিয়ালাইজেশন অন্তর্ভুক্তি (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.
জিরো 3

2.5.4 ব্যবহারের জন্যmapper.setSerializationInclusion(Include.NON_NULL);
আর্টুরো ভলপ


12

আমার ক্ষেত্রে

@JsonInclude(Include.NON_EMPTY)

এটি কাজ করে।


2
NON_EMPTY NON_NULL থেকে চতুরভাবে ভিন্ন - এটা নাল মান উপেক্ষা করা হবে, সত্যি যে, কিন্তু এছাড়াও খালি বিবেচিত মূল্যবোধ, যা কাঙ্ক্ষিত আচরণ নাও হতে পারে উপেক্ষা করি। আরও তথ্যের জন্য জ্যাকসন জাভাদোকগুলি দেখুন
davnicwil

আমি এই উত্তরটি পছন্দ করি কারণ প্রকৃতপক্ষে alচ্ছিক জিনিসগুলি থেকে ptionচ্ছিক প্রত্যাবর্তন করা একটি ভাল ধারণা, এবং কেবল NON_NULL দিয়ে আপনি শূন্যতার মতো কিছু পাবেন { }, যা নিরবচ্ছিন্নভাবে একটি জাভা প্রতিমাটি ভোক্তার কাছে স্থানান্তর করে। অ্যাটমিক রেফারেন্সের সাথে একই - গ্রাহক কীভাবে বিবেচনা করে না যে বিকাশকারী কীভাবে প্রতিক্রিয়ার অভ্যন্তরীণ উপস্থাপনায় থ্রেড সুরক্ষা প্রয়োগ করতে বেছে নিয়েছে।
লুকাস রস

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

কাজ করা উচিত.

Include.NON_EMPTYইঙ্গিত দেয় যে সম্পত্তিটি ক্রমীকৃত হয় যদি এর মানটি শূন্য না হয় এবং খালি না হয়। Include.NON_NULLইঙ্গিত দেয় যে সম্পত্তিটি যদি মানটি শূন্য না হয় তবে ক্রমিকায়িত হয়।


2
JsonInclude.Include.NON_EMPTY- এটি NOT_NULL কেস কভার করার পরে যথেষ্ট
ইলিয়া বুজুক

5

আপনি যদি জ্যাকসন ২.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/references/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper


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); জ্যাকসনইনক্লুড ডক
ওলগুন কেয়া

2

যদি আপনি অবজেক্টের একটি তালিকা সিরিয়ালাইজ করার চেষ্টা করছেন এবং তার মধ্যে একটি শূন্য হয় তবে আপনি JSON এর নাল আইটেমটি সহ শেষ করবেন

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

টিপ: আপনি যদি ড্রপ উইজার্ড ব্যবহার করছেন তবে আপনি ObjectMapperজার্সি ব্যবহার করে যা ব্যবহার করছেন তা পুনরুদ্ধার করতে পারেনenvironment.getObjectMapper()


1

আমাদের কাছে এই প্রশ্নের অনেক উত্তর রয়েছে। এই উত্তরটি কিছু পরিস্থিতিতে সহায়ক হতে পারে আপনি যদি নাল মানগুলিকে অগ্রাহ্য করতে চান তবে আপনি ক্লাস স্তরে NOT_NULL ব্যবহার করতে পারেন। নীচের হিসাবে

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

কিছু সময় আপনাকে খালি মানগুলি উপেক্ষা করার দরকার হতে পারে যেমন আপনি অ্যারেলিস্ট শুরু করে থাকতে পারেন তবে সেই তালিকার কোনও উপাদান নেই time সেই সময় খালি মান ক্ষেত্রগুলিকে অগ্রাহ্য করার জন্য NOT_EMPTY টীকাটি ব্যবহার করে

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

0

জ্যাকসন ২.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.
জিরো 3

0

এছাড়াও, নথিগুলি এলোমিনেট করার জন্য ডকুমেন্টেশনে বর্ণিত ম্যাপ মাই ভ্যারিয়েবল ব্যবহার করার সময় আপনাকে আপনার দৃষ্টিভঙ্গি পরিবর্তন করতে হবে:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.