How to exclude property from Json Serialization

后端 未结 7 1388
粉色の甜心
粉色の甜心 2020-11-22 13:22

I have a DTO class which I Serialize

Json.Serialize(MyClass)

How can I exclude a public property of it?

(It has to

相关标签:
7条回答
  • 2020-11-22 13:30

    You can also use the [NonSerialized] attribute

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

    From the MS docs:

    Indicates that a field of a serializable class should not be serialized. This class cannot be inherited.


    If you're using Unity for example (this isn't only for Unity) then this works with UnityEngine.JsonUtility

    using UnityEngine;
    
    MySerializableStruct mss = new MySerializableStruct 
    { 
        hiddenField = "foo", 
        normalField = "bar" 
    };
    Debug.Log(JsonUtility.ToJson(mss)); // result: {"normalField":"bar"}
    
    0 讨论(0)
  • 2020-11-22 13:31

    If you are using Json.Net attribute [JsonIgnore] will simply ignore the field/property while serializing or 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; }
    }
    

    Or you can use DataContract and DataMember attribute to selectively serialize/deserialize properties/fields.

    [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; }
    }
    

    Refer http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size for more details

    0 讨论(0)
  • 2020-11-22 13:31

    If you are using System.Text.Json then you can use [JsonIgnore].
    FQ: System.Text.Json.Serialization.JsonIgnoreAttribute

    Official Microsoft Docs: JsonIgnoreAttribute

    As stated here:

    The library is built-in as part of the .NET Core 3.0 shared framework.
    For other target frameworks, install the System.Text.Json NuGet package. The package supports:

    • .NET Standard 2.0 and later versions
    • .NET Framework 4.6.1 and later versions
    • .NET Core 2.0, 2.1, and 2.2
    0 讨论(0)
  • 2020-11-22 13:34

    If you are using System.Web.Script.Serialization in the .NET framework you can put a ScriptIgnore attribute on the members that shouldn't be serialized. See the example taken from here:

    Consider the following (simplified) case:

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

    In this case, only the Id and the Name properties will be serialized, thus the resulting JSON object would look like this:

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

    PS. Don't forget to add a reference to "System.Web.Extensions" for this to work

    0 讨论(0)
  • 2020-11-22 13:34

    You can use [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); }
        }
    }
    

    Reference here

    In this case the Id and then name will only be serialized

    0 讨论(0)
  • 2020-11-22 13:41

    If you are not so keen on having to decorate code with Attributes as I am, esp when you cant tell at compile time what will happen here is my solution.

    Using the Javascript Serializer

        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
            }
        }
    
    0 讨论(0)
提交回复
热议问题