ক্লাসে কোনও সম্পত্তি কীভাবে উপেক্ষা করবেন, json.net ব্যবহার করে


529

আমি JSON- এ ক্লাসটি সিরিয়াল করতে Json.NET ব্যবহার করছি ।

আমার মতো ক্লাস আছে:

class Test1
{
    [JsonProperty("id")]
    public string ID { get; set; }
    [JsonProperty("label")]
    public string Label { get; set; }
    [JsonProperty("url")]
    public string URL { get; set; }
    [JsonProperty("item")]
    public List<Test2> Test2List { get; set; }
}

আমি যোগ করতে চান JsonIgnore()করতে অ্যাট্রিবিউট Test2Listসম্পত্তি শুধুমাত্র যখন Test2Listহয় null। যদি এটি শূন্য না হয় তবে আমি এটিকে আমার জসনে অন্তর্ভুক্ত করতে চাই।

উত্তর:


685

জেমস নিউটন কিং অনুসারে: আপনি যদি জাভাস্ক্রিপ্ট কনভার্ট ব্যবহার না করে নিজেই সিরিয়ালাইজার তৈরি করেন তবে এমন একটি NullValueHandlingসম্পত্তি রয়েছে যা আপনি উপেক্ষা করতে পারেন।

একটি নমুনা এখানে:

JsonSerializer _jsonWriter = new JsonSerializer {
                                 NullValueHandling = NullValueHandling.Ignore
                             };

বিকল্প হিসাবে, @ এমিট দ্বারা প্রস্তাবিত

JsonConvert.SerializeObject(myObject, 
                            Newtonsoft.Json.Formatting.None, 
                            new JsonSerializerSettings { 
                                NullValueHandling = NullValueHandling.Ignore
                            });

159
এটি কাজ করে: জসনকনভার্ট.সিরালাইজওবজেক্ট (মাইবজেক্ট, নিউটোনসফট.জসন.ফর্ম্যাটটিং.নোন, নতুন জসনসিরাইজারসেটেটিংস {নালভ্যালুহ্যান্ডলিং = নালভ্যালুহ্যান্ডলিং Iআজনার;);
অমিত

এটি আমার পক্ষে কাজ করেছিল তবে JsonSerializerSettingsJsonSerializer
শেষেরটির

1
একটি গুরুত্বপূর্ণ বিষয় - এটি কেবলমাত্র কংক্রিটের ক্লাসগুলির সাথে কাজ করে (ব্যক্তি, অ্যাকাউন্ট ইত্যাদি)। যখন আমি অভিধানের মাধ্যমে এটি চেষ্টা করেছি, এটি কার্যকর হয়নি
চেস্টার 89

1
আমি @ চেস্টার 89 এর মতো একই সমস্যা পেয়েছি। একটি ExpandoObject নাল মান অগ্রাহ্য করা হয় না। এটি একটি বাগ (json.net 9.0.1 ব্যবহার করে) বলে মনে হচ্ছে
kwrl

2
উত্তরটি যখন লেখা হয়েছিল, JSON.Net এমনকি গতিশীল বস্তুগুলিকে সমর্থন করে না। :) এই মুহুর্তে, আপনি আপনার বিড করতে একটি কাস্টম রূপান্তরকারী ব্যবহার করতে পারেন।
মিচিফ

922

JsonPropertyবৈশিষ্ট্যটি ব্যবহার করে একটি বিকল্প সমাধান :

[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
// or
[JsonProperty("property_name", NullValueHandling=NullValueHandling.Ignore)]

// or for all properties in a class
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]

যেমনটি এই অনলাইন ডকটিতে দেখা যায় ।


19
গৃহীত উত্তরটি আরও ভাল কারণ এটি আপনার ক্লাসগুলিকে Json.net বৈশিষ্ট্যের সাথে দূষিত করে না।
সের্গেই

117
@ সার্জি এটি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে। যদি আপনি কেবল এটি নির্দিষ্ট বৈশিষ্ট্যের জন্য থাকতে চান (প্রশ্নে উল্লিখিত), তবে এটি সঠিক উত্তর। আপনি যদি বিশ্বব্যাপী উত্তর চান তবে আপনার সম্পত্তিটি জসনসিরাইজারে সেট করা উচিত।
sibbl

সম্মত - এটি সহজ এবং মার্জিত। Upvoting মূল্যবান। দুর্দান্ত কাজ করে - আপনি যে বিবিতে কিছুতেই সিরিয়াল করতে চান সেই বস্তুর একটি সম্পত্তি সেট করুন এবং এটি আর জেএসএনের অংশ নয়। এটি কেবল স্ট্রিংসের সাথেই কাজ করবে। এনাম বা পূর্ণসংখ্যাযুক্ত বৈশিষ্ট্যগুলি সর্বদা প্রদর্শিত হবে - নির্ধারণ নির্বিশেষে "0" এর ডিফল্ট মানটিতে কিছুই ফলাফল হয় না।
দেশটেক

3
@ ডেসটেক আপনার রেফারেন্স টাইপ ক্ষেত্রগুলিকে নালাগুলি তৈরি করতে হবে, তারপরে সেগুলি অ্যাট্রিবিউট বা সেটিং ব্যবহার করে সিরিয়ালযুক্ত করা হবে না।
টনি

1
আপনার শ্রেণিগুলিকে অনেকগুলি বৈশিষ্ট্য সহ 'দূষিত' এড়াতে আপনি হ্যান্ডলিংয়ের নিয়মটিও চালু করতে পারেন [JsonObject], তবে লক্ষ্য করুন যে বৈশিষ্ট্যের নামটি আলাদা। [সম্পাদিত উত্তর]
সাইমন_উইভার

60

@ Sirthomas এর উত্তর অনুরূপ, JSON.NET এছাড়াও সম্মান সম্পত্তি উপর :EmitDefaultValueDataMemberAttribute

[DataMember(Name="property_name", EmitDefaultValue=false)]

আপনি ইতিমধ্যে [DataContract]এবং [DataMember]আপনার মডেল ধরণের ব্যবহার করছেন এবং JSON.NET- নির্দিষ্ট বৈশিষ্ট্য যুক্ত করতে না চাইলে এটি পছন্দসই হতে পারে ।


1
এটি এত সহায়ক! আমি একটি কাস্টম ব্যতিক্রম শ্রেণি নকশা করছিলাম এবং আমি সেখানে জসন.ন.ফট যোগ করতে চাইনি। ধন্যবাদ!
jpgrassi

2
এই। নেট কোর কাজ করে না। @ সিर्थোমাসের জবাব পুনরুদ্ধার করুন: ব্যবহার করুন [জসনপ্রোপার্টি (নালওয়ালুহ্যান্ডলিং = নালভ্যালুহ্যান্ডলিং.আইগনোর)]
ডেরিক

1
এটি আমার জন্য ভাল কাজ করে। নিউটোনসফট.জসন 10.0.2 এর সাথে নেট কোর।
কার্ল-জোহান সিজেগ্রেন 14 ই

33

তুমি লিখতে পারো: [JsonProperty("property_name",DefaultValueHandling = DefaultValueHandling.Ignore)]

এটি ডিফল্ট মানগুলি (কেবল নাল নয়) দিয়ে বৈশিষ্ট্যগুলি ক্রমিকায়িত না করারও যত্ন নেয়। উদাহরণস্বরূপ এটি enums জন্য দরকারী হতে পারে।


3
এটি ঠিক শারমোসের জবাবের সমান, আপনি এটি যুক্ত করলেন কেন?
ওএমজিটিচি

4
আপনার সদয় তথ্যের জন্য, ডিফল্টভ্যালুহ্যান্ডল্যান্ড এবং নুলভ্যালোহ্যান্ডলিংয়ের মধ্যে পার্থক্য রয়েছে ...
প্যাটেল

4
আপনি কি আপনার উত্তরে তা ব্যাখ্যা করতে পারেন? প্রথম নজরে, এটি দেখতে একই রকম, এবং এখন আপনি এটি উল্লেখ করেছেন যে এটি অন্য উত্তর থেকে কীভাবে আলাদা হয় / কীভাবে এটি প্রশংসা করে তা উল্লেখ করে না।
ওএমজিটিচি

1
যদিও গৃহীত উত্তরটি কিছু পরিস্থিতিতে কার্যকর হতে পারে তবে এটি ব্যবহার করা সর্বদা সম্ভব নয়। চিকিত্সক ঠিক এই আদেশ করলেন।
মেলবোর্ন বিকাশকারী

1
আমি মনে করি এটিই আমি চেয়েছিলাম। নির্দিষ্ট বৈশিষ্ট্যগুলিতে নির্দিষ্ট হ্যান্ডলিং, সমস্ত কিছু নয়।
হিমশীতল

23

আপনি যে বস্তুটি সিরিয়াল করছেন তার সমস্ত নাল উপেক্ষা করার জন্য আপনি এটি করতে পারেন এবং কোনও নাল বৈশিষ্ট্য জাসনে প্রদর্শিত হবে না

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.NullValueHandling = NullValueHandling.Ignore;
var myJson = JsonConvert.SerializeObject(myObject, settings);

12

তাদের লিঙ্কটিতে যেমন দেখা যাবে (http://james.newtonking.com/archive/2009/10/23/eype-json-with-json-net-reducing-serialized-json-size.aspx) I ডিফল্ট মান নির্দিষ্ট করতে [ডিফল্ট ()] ব্যবহার করে সমর্থন করুন

লিঙ্ক থেকে নেওয়া

   public class Invoice
{
  public string Company { get; set; }
  public decimal Amount { get; set; }

  // false is default value of bool
  public bool Paid { get; set; }
  // null is default value of nullable
  public DateTime? PaidDate { get; set; }

  // customize default values
  [DefaultValue(30)]
  public int FollowUpDays { get; set; }
  [DefaultValue("")]
  public string FollowUpEmailAddress { get; set; }
}


Invoice invoice = new Invoice
{
  Company = "Acme Ltd.",
  Amount = 50.0m,
  Paid = false,
  FollowUpDays = 30,
  FollowUpEmailAddress = string.Empty,
  PaidDate = null
};

string included = JsonConvert.SerializeObject(invoice,
  Formatting.Indented,
  new JsonSerializerSettings { });

// {
//   "Company": "Acme Ltd.",
//   "Amount": 50.0,
//   "Paid": false,
//   "PaidDate": null,
//   "FollowUpDays": 30,
//   "FollowUpEmailAddress": ""
// }

string ignored = JsonConvert.SerializeObject(invoice,
  Formatting.Indented,
  new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });

// {
//   "Company": "Acme Ltd.",
//   "Amount": 50.0
// }

4

@ মিস্টারফের / @ অমিতের উত্তরের জন্য একটি অভিযোজন, তবে ভিবি ব্যবহারকারী লোকদের জন্য

 Dim JSONOut As String = JsonConvert.SerializeObject(
           myContainerObject, 
           New JsonSerializerSettings With {
                 .NullValueHandling = NullValueHandling.Ignore
               }
  )

দেখুন: "অবজেক্ট ইনিশিয়ালাইজার: নামযুক্ত এবং নামবিহীন প্রকার (ভিজ্যুয়াল বেসিক)"

https://msdn.microsoft.com/en-us/library/bb385125.aspx


3

নেট কোর এটি এখন অনেক সহজ। আপনার স্টার্টআপ.সগুলিতে কেবল জসন বিকল্প যুক্ত করুন এবং আপনি সেটিংসটি কনফিগার করতে পারেন।


public void ConfigureServices(IServiceCollection services)

....

services.AddMvc().AddJsonOptions(options =>
{
   options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;               
});

1

জসন.এনইটি সহ

 public class Movie
 {
            public string Name { get; set; }
            public string Description { get; set; }
            public string Classification { get; set; }
            public string Studio { get; set; }
            public DateTime? ReleaseDate { get; set; }
            public List<string> ReleaseCountries { get; set; }
 }

 Movie movie = new Movie();
 movie.Name = "Bad Boys III";
 movie.Description = "It's no Bad Boys";

 string ignored = JsonConvert.SerializeObject(movie,
            Formatting.Indented,
            new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

ফলাফলটি হবে:

{
   "Name": "Bad Boys III",
   "Description": "It's no Bad Boys"
 }

1

সঙ্গে System.Text.Jsonএবং .NET কোর 3.0 এই আমার জন্য কাজ:

var jsonSerializerOptions = new JsonSerializerOptions()
{
    IgnoreNullValues = true
};
var myJson = JsonSerializer.Serialize(myObject, jsonSerializerOptions );

0

গ্লেনজির অত্যন্ত সহায়ক উত্তরে (সি # থেকে ভিবিতে সিনট্যাক্স অনুবাদ করা সর্বদা "সুস্পষ্ট" নয়) নাল মানগুলি কীভাবে পরিচালনা করা হয় তা পরিচালনা করতে আপনি পৃথক শ্রেণীর বৈশিষ্ট্যগুলিও সাজাতে পারেন। আপনি যদি এটি করেন তবে গ্লেনজির পরামর্শ থেকে বিশ্বব্যাপী জসনসিরিয়েলাইজারসেটিংগুলি ব্যবহার করবেন না, অন্যথায় এটি স্বতন্ত্র সজ্জাটিকে ওভাররাইড করে দেবে। আপনি যদি কোনও নাল আইটেমটি JSON এ হাজির করতে চান তবে এটি গ্রাহককে কোনও বিশেষ হ্যান্ডলিং করতে হবে না এমনটি কার্যকর হয়। উদাহরণস্বরূপ, যদি গ্রাহককে সাধারণত optionচ্ছিক আইটেমগুলির একটি অ্যারে জানতে হবে তবে এটি বর্তমানে খালি ... সম্পত্তি ঘোষণায় সাজসজ্জাটি এর মতো দেখায়:

<JsonPropertyAttribute("MyProperty", DefaultValueHandling:=NullValueHandling.Include)> Public Property MyProperty As New List(of String)

এই বৈশিষ্ট্যগুলির জন্য আপনি জেএসওএন পরিবর্তনে একেবারে উপস্থিত থাকতে চান না : = নালভ্যালুহ্যান্ডলিং nc অন্তর্ভুক্ত করুন : = নালভ্যালুহ্যান্ডলিং gnআনগোর করুন । যাইহোক, আমি খুঁজে পেয়েছি যে আপনি এক্সএমএল এবং জেএসওএন সিরিয়ালাইজেশন উভয়ের জন্য একটি সম্পত্তি সজ্জিত করতে পারেন (কেবল তাদের একে অপরের পাশে ডান দিন)। এটি আমাকে ডটনেটে এক্সএমএল সিরিয়ালাইজার বা ইচ্ছামতো নিউটনসফ্ট সিরিয়ালাইজারকে কল করার বিকল্প দেয় - উভয় পাশাপাশি কাজ করে এবং আমার গ্রাহকদের এক্সএমএল বা জেএসএন এর সাথে কাজ করার বিকল্প রয়েছে। এটি একটি ডোরকনবতে নট হিসাবে চটজলদি যেহেতু আমার গ্রাহকরা উভয়ই প্রয়োজন!


0

এখানে একই বিকল্পটি পাওয়া যায় তবে এটি অন্য পছন্দ সরবরাহ করে:

public class DefaultJsonSerializer : JsonSerializerSettings
{
    public DefaultJsonSerializer()
    {
        NullValueHandling = NullValueHandling.Ignore;
    }
}

তারপরে, আমি এটি এর মতো ব্যবহার করি:

JsonConvert.SerializeObject(postObj, new DefaultJsonSerializer());

এখানে পার্থক্যটি হ'ল:

  • JsonSerializerSettingsএটি ব্যবহৃত প্রতিটি স্থান তাত্ক্ষণিকভাবে এবং কনফিগার করে পুনরাবৃত্ত কোড হ্রাস করে ।
  • প্রতিটি বস্তুর প্রতিটি সম্পত্তি ক্রমিকায়িত করতে সময় বাঁচায়।
  • তবুও অন্য বিকাশকারীদের পুনরায় ব্যবহারযোগ্য বস্তুর উপর স্পষ্টভাবে নির্দিষ্ট করে সম্পত্তি নির্দিষ্ট করার পরিবর্তে সিরিয়ালাইজেশন বিকল্পগুলিতে নমনীয়তা দেয়।
  • আমার ব্যবহারের ক্ষেত্রে কোডটি একটি তৃতীয় পক্ষের গ্রন্থাগার এবং আমি বিকাশকারীদের উপর সিরিয়ালকরণ বিকল্পগুলি জোর করতে চাই না যারা আমার ক্লাসগুলি পুনরায় ব্যবহার করতে চায়।
  • সম্ভাব্য ত্রুটিগুলি হ'ল এটি অন্য একটি বিষয় যা অন্য বিকাশকারীদের সম্পর্কে জানতে হবে, বা যদি আপনার অ্যাপ্লিকেশনটি ছোট হয় এবং এই পদ্ধতিটি কোনও একক সিরিয়ালের জন্য কিছু যায় আসে না।

-1
var settings = new JsonSerializerSettings();
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
settings.NullValueHandling = NullValueHandling.Ignore;
//you can add multiple settings and then use it
var bodyAsJson = JsonConvert.SerializeObject(body, Formatting.Indented, settings);

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