Json Serialization से संपत्ति को बाहर कैसे करें


234

मेरे पास एक डीटीओ क्लास है जिसे मैं सीरियल करता हूं

Json.Serialize(MyClass)

मैं इसकी सार्वजनिक संपत्ति को कैसे छोड़ सकता हूं ?

(इसे सार्वजनिक करना होगा, क्योंकि मैं इसे अपने कोड में कहीं और उपयोग करता हूं)


4
आप किस क्रमिकरण ढांचे का उपयोग करते हैं?
पावेल गैटिलोव

37
IgnoreDataMember ScriptIgnore JsonIgnoreआपके द्वारा उपयोग किए जाने वाले धारावाहिक के आधार पर
LB

3
यह भी उल्लेखनीय है कि [NonSerialized] विशेषता है, जो केवल फ़ील्ड्स (गुण नहीं) पर लागू होती है, लेकिन अन्यथा JsonIgnore के समान प्रभाव है।
त्रिनको 13

ट्रेंको की टिप्पणी बहुत उपयोगी है .... यदि आप किसी फ़ील्ड पर इग्नोरडैम्बर का उपयोग करते हैं तो कोई त्रुटि नहीं होगी, लेकिन यह लागू नहीं होगा।
टिलिटो

जवाबों:


147

यदि आप System.Web.Script.Serialization.NET फ्रेमवर्क में उपयोग कर रहे हैं, तो आपScriptIgnore उन सदस्यों पर एक विशेषता डाल सकते हैं जिन्हें क्रमबद्ध नहीं किया जाना चाहिए। यहाँ से लिया गया उदाहरण देखें :

निम्नलिखित (सरलीकृत) मामले पर विचार करें:

public class User {
    public int Id { get; set; }
    public string Name { get; set; }
    [ScriptIgnore]
    public bool IsComplete
    {
        get { return Id > 0 && !string.IsNullOrEmpty(Name); }
    } 
} 

इस स्थिति में, केवल आईडी और नाम गुण क्रमबद्ध होंगे, इस प्रकार परिणामी JSON वस्तु इस तरह दिखाई देगी:

{ Id: 3, Name: 'Test User' }

पुनश्च। System.Web.Extensionsइसे काम करने के लिए " " संदर्भ जोड़ना न भूलें


10
मैंने पाया ScriptIgnoreमें System.Web.Script.Serializationनाम स्थान।
सोरंगवाला अब्बासाली

354

यदि आप Json.Net विशेषता का उपयोग कर रहे[JsonIgnore] हैं, तो क्रमिक रूप से या डिसेरराइजिंग करते समय फ़ील्ड / प्रॉपर्टी को आसानी से अनदेखा कर देंगे।

public class Car
{
  // included in JSON
  public string Model { get; set; }
  public DateTime Year { get; set; }
  public List<string> Features { get; set; }

  // ignored
  [JsonIgnore]
  public DateTime LastModified { get; set; }
}

या आप चुनिंदा रूप से सीरियल / डीसर्लाइज़ करने के गुण / फ़ील्ड्स के लिए DataContract और DataMember विशेषता का उपयोग कर सकते हैं।

[DataContract]
public class Computer
{
  // included in JSON
  [DataMember]
  public string Name { get; set; }
  [DataMember]
  public decimal SalePrice { get; set; }

  // ignored
  public string Manufacture { get; set; }
  public int StockCount { get; set; }
  public decimal WholeSalePrice { get; set; }
  public DateTime NextShipmentDate { get; set; }
}

देखें http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size अधिक जानकारी के लिए


37
अगर मैं ओपी होता, तो मैं चुने हुए [ScriptIgnore] समाधान पर इस जवाब को पसंद करता। मुख्य रूप से एक Json समाधान की बधाई के कारण एक Json समस्या है। क्यों शामिल है System.Web.Extensions जब आप उपयोग कर रहे हैं पुस्तकालय एक समाधान प्रदान करता है? पूर्ण सर्वोत्तम IMHO [IgnoreDataMember] विशेषता है, System.Runtime.Serialization के रूप में हर धारावाहिक के साथ संगत होना चाहिए जो आपको Json को स्वैप करना चाहिए।
स्टीव एच।

IgnoreDataMemberडिफ़ॉल्ट JsonResultधारावाहिक के साथ काम नहीं करता है ।
hendryanw

1
न्यूटन सॉफ्ट ने सिर्फ मेरी पूरी मदद की। इसने मेरे जोंस को बिना किसी गन्दे गुणों के अपने मॉडल से शामिल किए बिना साफ किया, जो कि बैकएंड के लिए हैं।
सोरंगवाला अब्बासाली

1
@JC राजा कैसे मैं desalinizing दौरान संपत्ति की उपेक्षा कर सकते केवल जब इस संपत्ति शून्य है
user123456

1
[NewtonSoft.Json] मैं केवल धारावाहिकीकरण को नजरअंदाज करना चाहता हूं। फिर इसके लिए कोई उपाय?
Trương Quốc Khanh

31

आप उपयोग कर सकते हैं [ScriptIgnore]:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    [ScriptIgnore]
    public bool IsComplete
    {
        get { return Id > 0 && !string.IsNullOrEmpty(Name); }
    }
}

यहाँ संदर्भ

इस स्थिति में आईडी और फिर नाम केवल क्रमबद्ध होंगे


1
आपके उत्तर का URL टूट गया है। क्या [ScriptIgnore]संपत्ति पर उपयोग किया जाना चाहिए यदि आपका नियंत्रक आधार MVC नियंत्रक का उपयोग कर रहा है return Json(...?
डॉन चेडल

2
मुझे पता है कि यह एक पुरानी टिप्पणी है, लेकिन हां, [ScriptIgnore]एमवीसी नियंत्रक में उपयोग करें । हालांकि चेतावनी दी जाती है, यदि आप सिग्नलआर का उपयोग कर रहे हैं , तो आपको [JsonIgnore]भी उपयोग करना चाहिए ।
सैम

21

क्षमा करें, मैंने एक और उत्तर लिखने का फैसला किया क्योंकि अन्य उत्तरों में से कोई भी कॉपी-पेस्ट करने योग्य नहीं है।

यदि आप कुछ विशेषताओं के साथ गुणों को सजाने के लिए नहीं चाहते हैं, या यदि आपके पास कक्षा तक कोई पहुंच नहीं है, या यदि आप तय करना चाहते हैं कि रनटाइम के दौरान क्या करना है, आदि आदि तो यहां आप इसे न्यूटनसॉफ्ट में कैसे करते हैं।

//short helper class to ignore some properties from serialization
public class IgnorePropertiesResolver : DefaultContractResolver
{
    private IEnumerable<string> _propsToIgnore;
    public IgnorePropertiesResolver(IEnumerable<string> propNamesToIgnore)
    {
        _propsToIgnore = propNamesToIgnore;
    }
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);
        property.ShouldSerialize = (x) => { return !_propsToIgnore.Contains(property.PropertyName); };
        return property;
    }
}

प्रयोग

JsonConvert.SerializeObject(YourObject, new JsonSerializerSettings()
    { ContractResolver = new IgnorePropertiesResolver(new[] { "Prop1", "Prop2" }) };);

अगर किसी को कुछ भी जोड़ना हो तो मैंने यहाँ कोड प्रकाशित किया है

https://github.com/jitbit/JsonIgnoreProps

महत्वपूर्ण अद्यतन:ContractResolver यदि आप इस उत्तर का उपयोग करने का निर्णय लेते हैं, तो सुनिश्चित करें कि आप ऑब्जेक्ट को कैश कर दें, अन्यथा प्रदर्शन को नुकसान हो सकता है।


15

यदि आप एट्रीब्यूट्स के साथ कोड को सजाने के लिए इतने उत्सुक नहीं हैं जैसा कि मैं हूं, तो जब आप संकलन समय पर बताएंगे कि यहां क्या होगा तो मेरा समाधान है।

जावास्क्रिप्ट सीरियल का उपयोग करना

    public static class JsonSerializerExtensions
    {
        public static string ToJsonString(this object target,bool ignoreNulls = true)
        {
            var javaScriptSerializer = new JavaScriptSerializer();
            if(ignoreNulls)
            {
                javaScriptSerializer.RegisterConverters(new[] { new PropertyExclusionConverter(target.GetType(), true) });
            }
            return javaScriptSerializer.Serialize(target);
        }

        public static string ToJsonString(this object target, Dictionary<Type, List<string>> ignore, bool ignoreNulls = true)
        {
            var javaScriptSerializer = new JavaScriptSerializer();
            foreach (var key in ignore.Keys)
            {
                javaScriptSerializer.RegisterConverters(new[] { new PropertyExclusionConverter(key, ignore[key], ignoreNulls) });
            }
            return javaScriptSerializer.Serialize(target);
        }
    }


public class PropertyExclusionConverter : JavaScriptConverter
    {
        private readonly List<string> propertiesToIgnore;
        private readonly Type type;
        private readonly bool ignoreNulls;

        public PropertyExclusionConverter(Type type, List<string> propertiesToIgnore, bool ignoreNulls)
        {
            this.ignoreNulls = ignoreNulls;
            this.type = type;
            this.propertiesToIgnore = propertiesToIgnore ?? new List<string>();
        }

        public PropertyExclusionConverter(Type type, bool ignoreNulls)
            : this(type, null, ignoreNulls){}

        public override IEnumerable<Type> SupportedTypes
        {
            get { return new ReadOnlyCollection<Type>(new List<Type>(new[] { this.type })); }
        }

        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            var result = new Dictionary<string, object>();
            if (obj == null)
            {
                return result;
            }
            var properties = obj.GetType().GetProperties();
            foreach (var propertyInfo in properties)
            {
                if (!this.propertiesToIgnore.Contains(propertyInfo.Name))
                {
                    if(this.ignoreNulls && propertyInfo.GetValue(obj, null) == null)
                    {
                         continue;
                    }
                    result.Add(propertyInfo.Name, propertyInfo.GetValue(obj, null));
                }
            }
            return result;
        }

        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            throw new NotImplementedException(); //Converter is currently only used for ignoring properties on serialization
        }
    }

1
तर्क में एक मामूली बदलाव और PropertyExclusionConverterइसे एक में बदल दिया जा सकता है PropertyInclusionConverter
जारेफथ

यह सिर्फ भयानक है
साईकिरण मंडला

इसके साथ एक संभावित मुद्दा यह है कि हर बार किसी वस्तु को क्रमबद्ध रूप से नाम-मिलान और बहिष्करण कार्य करना पड़ता है। हालाँकि, एक बार संकलित करने के बाद, एक प्रकार के गुण नहीं बदलेंगे - आपको यह पूर्व-गणना, प्रति प्रकार, उन नामों को बनाना चाहिए जिन्हें शामिल किया जाना चाहिए और प्रत्येक पंक्ति में सूची का पुन: उपयोग करना चाहिए। एक बहुत बड़े JSON क्रमिक नौकरी के लिए, कैशिंग प्रदर्शन में ध्यान देने योग्य अंतर बना सकता है।
एरिक

9

यदि आप उपयोग कर रहे हैं System.Text.Jsonतो आप उपयोग कर सकते हैं [JsonIgnore]
FQ:System.Text.Json.Serialization.JsonIgnoreAttribute

आधिकारिक Microsoft डॉक्स: JsonIgnoreAttribute

जैसा कि यहाँ कहा गया है :

लाइब्रेरी .NET .NET 3.0 साझा ढांचे के हिस्से के रूप में निर्मित है।
अन्य लक्ष्य रूपरेखाओं के लिए, System.Text.Json NuGet पैकेज स्थापित करें। पैकेज का समर्थन करता है:

  • .NET मानक 2.0 और बाद के संस्करण
  • .NET फ्रेमवर्क 4.6.1 और बाद के संस्करण
  • .NET कोर 2.0, 2.1 और 2.2

0

आप [NonSerialized]विशेषता का उपयोग भी कर सकते हैं

[Serializable]
public struct MySerializableStruct
{
    [NonSerialized]
    public string hiddenField;
    public string normalField;
}

एमएस डॉक्स से :

इंगित करता है कि एक श्रेणीबद्ध श्रेणी के क्षेत्र को क्रमबद्ध नहीं किया जाना चाहिए। इस वर्ग को विरासत नहीं बनाया जा सकता।


यदि आप उदाहरण के लिए एकता का उपयोग कर रहे हैं ( यह केवल एकता के लिए नहीं है ) तो यह काम करता हैUnityEngine.JsonUtility

using UnityEngine;

MySerializableStruct mss = new MySerializableStruct 
{ 
    hiddenField = "foo", 
    normalField = "bar" 
};
Debug.Log(JsonUtility.ToJson(mss)); // result: {"normalField":"bar"}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.