Search code examples
c#.netjsonserialization

Remove empty string properties from json serialized object


I have a class. It has several properties lets say 10. Out of these 10, 3 are filled with data remaining 7 are blank.i.e. empty strings "" Used this link as reference. I would like only NON-NULL and NON-EMPTY string properties to be shown. But the end output has all 10 properties. I want only to see 3.

namespace Mynamespace.ValueObjects
{
[DataContract]
public class User
{
      [DataMember(Name ="userID", IsRequired = false,EmitDefaultValue = false)]
    public string userID { get; set; }
      [DataMember(Name ="ssn", IsRequired = false,EmitDefaultValue = false)]
    public string ssn { get; set; }
      [DataMember(Name ="empID", IsRequired = false,EmitDefaultValue = false)]
    public string empID { get; set; }
      [DataMember(Name ="schemaAgencyName", IsRequired = false,EmitDefaultValue = false)]
    public string schemaAgencyName { get; set; }
      [DataMember(Name ="givenName", IsRequired = false,EmitDefaultValue = false)]
    public string givenName { get; set; }
      [DataMember(Name ="familyName", IsRequired = false,EmitDefaultValue = false)]
    public string familyName { get; set; }
      [DataMember(Name ="password", IsRequired = false,EmitDefaultValue = false)]
    public string password { get; set; }
      ....

}

}

I also tried with

 [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]

as the attribute too. No luck. I also did like this

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

where 'usr' is the User instance. By no luck I mean, the 't' comes back with all the 10 properties

{"userID":"vick187","ssn":"","empID":"","schemaAgencyName":"","givenName":"","familyName":"","password":"pwd1234",...}

So as you can see only userID and password are populated. But I have ssn, empID etc still showing up. I only want userID and password. Any help would be appreciated.


Solution

  • Just decorating the properties [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] ONLY should do what you want. Unless the property is getting set to an empty string.

    Just wondering, why do you need the DataMemeber attribute?

    Here is a link to a working dotnetfiddle

    using System;
    using Newtonsoft.Json;
    using System.ComponentModel;
    
    public class Program
    {
    
        public static void Main()
        {
            var user = new User();
    
            user.UserID = "1234";
            user.ssn = "";
    
            var settings = new JsonSerializerSettings();
    
            settings.NullValueHandling = NullValueHandling.Ignore;
            settings.DefaultValueHandling = DefaultValueHandling.Ignore;
    
    
            Console.WriteLine(JsonConvert.SerializeObject(user, settings));
        }
    }
    
    public class User
    {
        [DefaultValue("")]
        public string UserID { get; set; }
    
        [DefaultValue("")]
        public string ssn { get; set; }
    
        [DefaultValue("")]
        public string empID { get; set; }
    
        [DefaultValue("")]
        public string schemaAgencyName { get; set; }
    
        [DefaultValue("")]
        public string givenName { get; set; }
    
        [DefaultValue("")]
        public string familyName { get; set; }
    
        [DefaultValue("")]
        public string password { get; set; }
    }