জসন সিরিয়ালাইজেশন থেকে কীভাবে সম্পত্তি বর্জন করবেন


234

আমার একটি ডিটিও ক্লাস রয়েছে যা আমি সিরিয়ালাইজ করি

Json.Serialize(MyClass)

কীভাবে আমি এর একটি সার্বজনীন সম্পত্তি বাদ দিতে পারি?

(এটি সর্বজনীন হতে হবে, যেহেতু আমি এটি আমার কোডে অন্য কোথাও ব্যবহার করি)


4
আপনি কোন সিরিয়ালাইজেশন কাঠামো ব্যবহার করেন?
পাভেল গাতিলভ

37
IgnoreDataMember ScriptIgnore JsonIgnoreআপনি যে সিরিয়ালাইজারটি ব্যবহার করছেন তার উপর নির্ভর করে
এলবি

3
এছাড়াও লক্ষণীয় হ'ল [নন-সিরিয়ালাইজড] বৈশিষ্ট্য, যা কেবল ক্ষেত্রগুলিতে প্রয়োগ করা হয় (বৈশিষ্ট্য নয়), তবে অন্যথায় জসনআইগনোরের মতো একই প্রভাব ফেলে।
ট্রায়ঙ্কো

ট্রাইঙ্কোর মন্তব্য খুব দরকারী .... আপনি যদি কোনও ক্ষেত্রে IgnoreDataMember ব্যবহার করেন তবে কোনও ত্রুটি হবে না, তবে এটি প্রয়োগ করা হবে না।
টিলিটো

উত্তর:


147

আপনি যদি System.Web.Script.Serializationনেট নেট ফ্রেমওয়ার্ক ব্যবহার করছেন তবে আপনি 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]যখন serializing বা deserialising কেবল ক্ষেত্র / সম্পত্তি উপেক্ষা করা হবে।

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]
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
আমি যদি ওপি থাকি তবে আমি এই উত্তরটি নির্বাচিত [স্ক্রিপ্টআইগনোর] সমাধানের চেয়ে পছন্দ করতাম। মূলত একটি জসন সমাধানের জাগরণের কারণে তাই একটি জসন সমস্যা। আপনি যে লাইব্রেরিটি ব্যবহার করছেন তা যখন সমাধান সরবরাহ করে তখন সিস্টেম.ওয়েব.একটি এক্সটেনশানগুলি কেন জড়িত থাকে? পরম সেরা আইএমএইচও হ'ল [IgnoreDataMember] বৈশিষ্ট্যটি, সিস্টেম হিসাবে un রুনটাইম।
স্টিভ এইচ।

IgnoreDataMemberডিফল্ট JsonResultসিরিয়ালাইজারের সাথে কাজ করে না ।
হেন্ড্রিয়ানউ

1
নিউটনসফট সবেমাত্র আমাকে পুরোপুরি সহায়তা করেছিল। এটি আমার জেসনকে আমার মডেলগুলি থেকে অন্তর্গত কোনও জঞ্জাল সম্পত্তি বাদ দিয়ে পরিষ্কার দেখায় যা কেবল ব্যাকএন্ডের জন্য।
সোরঙ্গওয়ালা আব্বাসালী

1
@ জে সি রাজা এই সম্পত্তিটি বাতিল হলেই আমি কীভাবে সম্পত্তি উপেক্ষা করতে পারি
ব্যবহারকারী 123456

1
[নিউটনসফট.জসন] আমি কেবল সিরিয়ালিং উপেক্ষা করতে চাই। তাহলে এর কোন সমাধান?
Trương গান Quốc গান Khánh

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

দুঃখিত, আমি অন্য উত্তর লেখার সিদ্ধান্ত নিয়েছি কারণ অন্য কোনও উত্তরই যথেষ্ট পরিমাণে অনুলিপিযোগ্য নয় paste

আপনি যদি কিছু বৈশিষ্ট্য সহ বৈশিষ্ট্যগুলি সজ্জিত করতে না চান, বা শ্রেণিতে আপনার কোনও অ্যাক্সেস নেই, বা রানটাইম ইত্যাদির সময় কী কী সিরিয়ালিয়াল করতে হবে ইত্যাদি যদি আপনি সিদ্ধান্ত নিতে চান তবে এখানে নিউটোনসফট.জসনে এটি কীভাবে করবেন তা এখানে's

//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
জেরেফেথ

এটি কেবল দুর্দান্ত
সাইকিরান মান্ধালা

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

9

আপনি যদি ব্যবহার করেন System.Text.Jsonতবে আপনি ব্যবহার করতে পারেন [JsonIgnore]
FQ:System.Text.Json.Serialization.JsonIgnoreAttribute

অফিসিয়াল মাইক্রোসফ্ট ডক্স: জসনআইগনআর্ট্রিবিউট

এখানে যেমন বলা হয়েছে :

.NET কোর 3.0 ভাগ করা কাঠামোর অংশ হিসাবে গ্রন্থাগারটি অন্তর্নির্মিত।
অন্যান্য টার্গেট ফ্রেমওয়ার্কের জন্য, System.Text.Json নিউগেট প্যাকেজ ইনস্টল করুন। প্যাকেজ সমর্থন করে:

  • .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;
}

এমএস ডক্স থেকে :

ইঙ্গিত দেয় যে সিরিয়ালীকরণযোগ্য শ্রেণির ক্ষেত্রটি ক্রমিক করা উচিত নয়। এই শ্রেণিটি উত্তরাধিকারসূত্রে প্রাপ্ত হতে পারে না।


আপনি যদি উদাহরণ হিসাবে ইউনিটি ব্যবহার করছেন ( এটি কেবল ityক্যের জন্য নয় ) তবে এটি এর সাথে কাজ করেUnityEngine.JsonUtility

using UnityEngine;

MySerializableStruct mss = new MySerializableStruct 
{ 
    hiddenField = "foo", 
    normalField = "bar" 
};
Debug.Log(JsonUtility.ToJson(mss)); // result: {"normalField":"bar"}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.