दिलचस्प पोस्ट
एक ज़ूम करने योग्य ViewGroup को बनाने के लिए RelativeLayout को विस्तारित करना, और ओवरराइडिंग डिस्पैच () क्रम से पहले NULLS सबसे पहले तो सबसे हाल की तारीख दिखा इनलाइन ब्लॉक तत्वों के बीच की जगह को कैसे निकालना है? 'अगर' कथन बुरा क्यों माना जाता है? जब मैं शाखाओं को स्विच करता हूँ तो गिट एक उपेक्षित फाइल को हटा रहा है JFreeChart पोलरप्लॉट: गणितीय अभिविन्यास सॉकेट.आईओ हैंडलिंग डिस्कनेक्ट इवेंट जी ++ में प्रोफ़ाइल निर्देशित अनुकूलन का उपयोग कैसे करें? @ संश्लेषित इंस्टेंस चर की दृश्यता क्या है? सी # सर्वोच्च सरणी मूल्य और सूचकांक खोजें @Mock और @InjectMocks के बीच का अंतर एंड्रॉइड जीसीएम सफलतापूर्वक भेजा गया लेकिन कुछ उपकरणों पर प्राप्त नहीं हुआ जावास्क्रिप्ट नेस्टेड फ़ंक्शन इस विशिष्ट मामले में, क्या कोई सदस्य प्रारंभिक सूची का उपयोग करने और कन्स्ट्रक्टर में मूल्यों को निर्दिष्ट करने में कोई अंतर है? रूबी: आइटम को सरणी में कैसे ढूंढें, जिसमें सबसे अधिक घटनाएं हैं?

एक संपत्ति बनाना deserialize लेकिन json.net के साथ क्रमबद्ध नहीं है

हमारे पास कुछ कॉन्फ़िगरेशन फाइलें हैं जो सी # ऑब्जेक्ट्स को जेएसएनएन से सीरियल करना द्वारा उत्पन्न हुई थी।

हम धारावाहिक वर्ग की एक संपत्ति को एक वर्ग संपत्ति में एक सरल एन्यूम संपत्ति होने से दूर करना चाहते हैं।

ऐसा करने का एक आसान तरीका, कक्षा में पुरानी इकाई संपत्ति को छोड़ना होगा, और जब हम कॉन्फ़िग को लोड करते हैं, लेकिन इसे फिर से सहेजने के लिए इस संपत्ति को पढ़ने के लिए Json.net की व्यवस्था करते हैं, तो हम अगले वस्तु को क्रमबद्ध करते हैं। हम पुरानी गणक से अलग-अलग नए वर्ग को पैदा करने के साथ सौदा करेंगे।

क्या सी # ऑब्जेक्ट की संपत्ति (उदाहरण के लिए गुणों के साथ) को चिन्हित करने के लिए कोई आसान तरीका है, ताकि जेएसएनओएन इसे केवल तभी अनदेखा करे जब सीरियललाइज करना चाहिए, लेकिन जब deserializing करने के लिए इसमें शामिल हो?

Solutions Collecting From Web of "एक संपत्ति बनाना deserialize लेकिन json.net के साथ क्रमबद्ध नहीं है"

वास्तव में बहुत सारे साधारण दृष्टिकोण हैं जो आप चाहते हैं कि परिणाम प्राप्त करने के लिए उपयोग कर सकते हैं।

मान लीजिए, उदाहरण के लिए, आपने अपनी कक्षाएं वर्तमान में इस तरह परिभाषित की हैं:

class Config { public Fizz ObsoleteSetting { get; set; } public Bang ReplacementSetting { get; set; } } enum Fizz { Alpha, Beta, Gamma } class Bang { public string Value { get; set; } } 

और आप यह करना चाहते हैं:

 string json = @"{ ""ObsoleteSetting"" : ""Gamma"" }"; // deserialize Config config = JsonConvert.DeserializeObject<Config>(json); // migrate config.ReplacementSetting = new Bang { Value = config.ObsoleteSetting.ToString() }; // serialize json = JsonConvert.SerializeObject(config); Console.WriteLine(json); 

इसे प्राप्त करने के लिए:

 {"ReplacementSetting":{"Value":"Gamma"}} 

Approach 1: एक ShouldSerialize विधि जोड़ें

Json.NET में कक्षा में संबंधित ShouldSerialize तरीकों के लिए देखकर गुणों को सशर्त रूप से क्रमबद्ध करने की क्षमता है।

इस सुविधा का उपयोग करने के लिए, अपने वर्ग में बूलियन ShouldSerializeBlah() पद्धति जोड़ें, जहां Blah को उस संपत्ति के नाम से बदला गया है जिसे आप सीरियल करना नहीं चाहते हैं। बनाओ इस पद्धति का कार्यान्वयन हमेशा false वापसी।

 class Config { public Fizz ObsoleteSetting { get; set; } public Bang ReplacementSetting { get; set; } public bool ShouldSerializeObsoleteSetting() { return false; } } 

ध्यान दें: यदि आप इस दृष्टिकोण को पसंद करते हैं, लेकिन आप ShouldSerialize वर्ग के सार्वजनिक इंटरफ़ेस को ShouldSerialize नहीं करना चाहते हैं, तो आप एक ही प्रकार से प्रोग्राम करने के लिए IContractResolver का उपयोग कर सकते हैं। दस्तावेज़ीकरण में सशर्त संपदा सीरियलाइजेशन देखें।

दृष्टिकोण 2: जॉज़ेक्स के साथ JSON को हेरफेर करना

JsonConvert.SerializeObject करने के लिए JsonConvert.SerializeObject का उपयोग करने के बजाय, कॉन्फ़िग ऑब्जेक्ट को JObject में लोड करें, फिर इसे लिखने से पहले JObject से अवांछित प्रॉपर्टी निकाल दें। यह कोड की अतिरिक्त अतिरिक्त लाइनों की संख्या है।

 JObject jo = JObject.FromObject(config); // remove the "ObsoleteSetting" JProperty from its parent jo["ObsoleteSetting"].Parent.Remove(); json = jo.ToString(); 

दृष्टिकोण 3: चतुर (एबी) विशेषताओं का उपयोग

  1. उस प्रॉपर्टी में एक [JsonIgnore] विशेषता को लागू करें जिसे आप [JsonIgnore] नहीं करना चाहते हैं
  2. मूल संपत्ति के रूप में एक ही प्रकार के साथ एक वैकल्पिक, निजी संपत्ति सेटर को क्लास में जोड़ें उस संपत्ति के कार्यान्वयन को मूल संपत्ति सेट करें।
  3. वैकल्पिक सेटर में एक [JsonProperty] विशेषता को लागू करें, इसे मूल संपत्ति के रूप में एक ही JSON नाम दें।

संशोधित Config क्लास यहां है:

 class Config { [JsonIgnore] public Fizz ObsoleteSetting { get; set; } [JsonProperty("ObsoleteSetting")] private Fizz ObsoleteSettingAlternateSetter { // get is intentionally omitted here set { ObsoleteSetting = value; } } public Bang ReplacementSetting { get; set; } } 

मुझे इस पर विशेषताओं के साथ चिपका पसंद है, यहां विधि है जिसका उपयोग मैं एक संपत्ति को deserialize करने की आवश्यकता है, लेकिन इसे क्रमबद्ध या इसके विपरीत नहीं है

चरण 1 – कस्टम विशेषता बनाएं

 public class JsonIgnoreSerializationAttribute : Attribute { } 

कदम 2 – एक कस्टम अनुबंध Reslover बनाएँ

 class JsonPropertiesResolver : DefaultContractResolver { protected override List<MemberInfo> GetSerializableMembers(Type objectType) { //Return properties that do NOT have the JsonIgnoreSerializationAttribute return objectType.GetProperties() .Where(pi => !Attribute.IsDefined(pi, typeof(JsonIgnoreSerializationAttribute))) .ToList<MemberInfo>(); } } 

चरण 3 – विशेषता जोड़ें जहां serialization की आवश्यकता नहीं है लेकिन deserialization है

  [JsonIgnoreSerialization] public string Prop1 { get; set; } //Will be skipped when serialized [JsonIgnoreSerialization] public string Prop2 { get; set; } //Also will be skipped when serialized public string Prop3 { get; set; } //Will not be skipped when serialized 

चरण 4 – इसका उपयोग करें

 var sweet = JsonConvert.SerializeObject(myObj, new JsonSerializerSettings { ContractResolver = new JsonPropertiesResolver() }); 

उम्मीद है की यह मदद करेगा! इसके अलावा यह ध्यान देने योग्य है कि यह गुणों की भी अनदेखी करेगा, जब देसराइलाइजेशन होता है, जब मैं घबराहट कर रहा हूं तो मैं पारंपरिक रूप से कनवर्टर का इस्तेमाल करता हूं।

 JsonConvert.DeserializeObject<MyType>(myString); 

एक लंबे समय के लिए खोज करने के बाद मैं एक श्रेणी संपत्ति को डी-सीरियलाज करने योग्य और बिना सीरियलाइज़ करने के लिए फ़्लैग कैसे करना चाहता हूं, मुझे पता चला कि ऐसा करने के लिए ऐसी कोई चीज नहीं है; इसलिए मैं एक ऐसे समाधान के साथ आया हूं जो दो अलग-अलग पुस्तकालयों या धारावाहिक तकनीकों (सिस्टम। रनटाइम। सेरिअलाइज़ेशन। जेसन और न्यूटोंसंफ्ट। जेसन) को जोड़ता है और यह मेरे लिए निम्न की तरह काम करता है:

  • अपने सभी वर्ग और उप-वर्गों को "डेटाकॉन्ट्रैक्ट" के रूप में फ़्लैग करें
  • अपनी कक्षा और उप-कक्षाओं के सभी गुणों को "डेटामेम्बर" के रूप में चिह्नित करें
  • अपनी कक्षा और उप-कक्षाओं के सभी गुणों को "जेसनप्रॉपर्टी" के रूप में ध्वजांकित करें, जिन्हें आप चाहते हैं कि उन्हें सीरियलकृत न करें।
  • अब उन गुणों को ध्वजांकित करें जिन्हें आप नहीं चाहते हैं कि इसे "जेसनइंजोरोर" के रूप में क्रमबद्ध किया जाए।
  • फिर "Newtonsoft.Json.JsonConvert.SerializeObject" और De-Serialize का उपयोग करके "System.Runtime.Serialization.Json.DataContractJsonSerializer" का उपयोग करके सीरियल करें।

     using System; using System.Collections.Generic; using Newtonsoft.Json; using System.Runtime.Serialization; using System.IO; using System.Runtime.Serialization.Json; using System.Text; namespace LUM_Win.model { [DataContract] public class User { public User() { } public User(String JSONObject) { MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(JSONObject)); DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(User)); User user = (User)dataContractJsonSerializer.ReadObject(stream); this.ID = user.ID; this.Country = user.Country; this.FirstName = user.FirstName; this.LastName = user.LastName; this.Nickname = user.Nickname; this.PhoneNumber = user.PhoneNumber; this.DisplayPicture = user.DisplayPicture; this.IsRegistred = user.IsRegistred; this.IsConfirmed = user.IsConfirmed; this.VerificationCode = user.VerificationCode; this.Meetings = user.Meetings; } [DataMember(Name = "_id")] [JsonProperty(PropertyName = "_id")] public String ID { get; set; } [DataMember(Name = "country")] [JsonProperty(PropertyName = "country")] public String Country { get; set; } [DataMember(Name = "firstname")] [JsonProperty(PropertyName = "firstname")] public String FirstName { get; set; } [DataMember(Name = "lastname")] [JsonProperty(PropertyName = "lastname")] public String LastName { get; set; } [DataMember(Name = "nickname")] [JsonProperty(PropertyName = "nickname")] public String Nickname { get; set; } [DataMember(Name = "number")] [JsonProperty(PropertyName = "number")] public String PhoneNumber { get; set; } [DataMember(Name = "thumbnail")] [JsonProperty(PropertyName = "thumbnail")] public String DisplayPicture { get; set; } [DataMember(Name = "registered")] [JsonProperty(PropertyName = "registered")] public bool IsRegistred { get; set; } [DataMember(Name = "confirmed")] [JsonProperty(PropertyName = "confirmed")] public bool IsConfirmed { get; set; } [JsonIgnore] [DataMember(Name = "verification_code")] public String VerificationCode { get; set; } [JsonIgnore] [DataMember(Name = "meeting_ids")] public List<Meeting> Meetings { get; set; } public String toJSONString() { return JsonConvert.SerializeObject(this, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }); } } } 

उम्मीद है की वो मदद करदे …

सेटर संपत्ति का उपयोग करें:

 [JsonProperty(nameof(IgnoreOnSerializing))] public string IgnoreOnSerializingSetter { set { _ignoreOnSerializing = value; } } [JsonIgnore] private string _ignoreOnSerializing; [JsonIgnore] public string IgnoreOnSerializing { get { return this._ignoreOnSerializing; } set { this._ignoreOnSerializing = value; } } 

उममीद है कि इससे मदद मिलेगी।

@ थोएचओ के समाधान के संदर्भ में, सेटर का उपयोग करके वास्तव में सभी की आवश्यकता होती है, कोई अतिरिक्त टैग नहीं के साथ

मेरे लिए मेरे पास पहले एक संदर्भ आईडी था, जिसे मैं संदर्भ आईडी के नए संग्रह को लोड और जोड़ना चाहता था। संदर्भ आईडी की परिभाषा को बदलने के लिए केवल एक सेटर विधि शामिल है, जिसने नए संग्रह में मूल्य जोड़ा। जेएसन मूल्य वापस नहीं लिख सकता है अगर संपत्ति में नहीं मिलता है; तरीका।

 // Old property that I want to read from Json, but never write again. No getter. public Guid RefId { set { RefIds.Add(value); } } // New property that will be in use from now on. Both setter and getter. public ICollection<Guid> RefIds { get; set; } 

यह वर्ग अब पिछले संस्करण के साथ पिछड़े संगत है और केवल नए संस्करणों के लिए RefIds बचाता है।

थो हो के उत्तर पर निर्माण करने के लिए, इसका उपयोग फ़ील्ड के लिए भी किया जा सकता है।

 [JsonProperty(nameof(IgnoreOnSerializing))] public string IgnoreOnSerializingSetter { set { IgnoreOnSerializing = value; } } [JsonIgnore] public string IgnoreOnSerializing;