从json序列化对象中删除空字符串属性

Roo*_*ler 9 .net c# serialization json

我上课了.它有几个属性可以说10.在这10个中,3个填充了剩余的数据7个为空.空字符串""使用此链接作为参考.我想只显示NON-NULL和NON-EMPTY字符串属性.但最终输出有10个属性.我只希望看到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; }
      ....

}
Run Code Online (Sandbox Code Playgroud)

}

我也尝试过

 [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
Run Code Online (Sandbox Code Playgroud)

作为属性也是.没运气.我也是这样的

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

其中'usr'是User实例.我的意思是,没有运气,'t'回来了所有10个属性

{"userID":"vick187","ssn":"","empID":"","schemaAgencyName":"","givenName":"","familyName":"","password":"pwd1234",...}
Run Code Online (Sandbox Code Playgroud)

因此,您只能看到填充了用户ID和密码.但我有ssn,empID等仍然出现.我只想要用户ID和密码.任何帮助,将不胜感激.

Bre*_*jor 20

只装饰房产[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]应该做你想要的.除非属性设置为空字符串.

只是想知道,为什么需要DataMemeber属性?

这是一个工作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; }
}
Run Code Online (Sandbox Code Playgroud)

  • 有用!!谢谢布伦顿.圣诞节快乐! (3认同)
  • @ali-myousefi 您可以删除 `settings.DefaultValueHandling = DefaultValueHandling.Ignore;` 行,并可能删除 DefaultValue 属性。字符串的默认值为 NULL,因此 `settings.NullValueHandling = NullValueHandling.Ignore;` 应该就是您所需要的。.NET Fiddle 供参考 https://dotnetfiddle.net/sVC0UU (2认同)

Bur*_*ğan 10

您还可以使用以下两个注释:

[DefaultValue("")]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Category { get; set; }
Run Code Online (Sandbox Code Playgroud)


Nic*_*ans 9

尽管接受的答案有效,但它也会删除零值的整数属性。我正在寻找更通用的东西来处理大对象。

在这里找到了一个很好的答案:https : //codearticles.ru/articles/2905?AspxAutoDetectCookieSupport=1

并将其整合到我们的用例中,如下所示:

public class ShouldSerializeContractResolver : DefaultContractResolver
{
    public static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        if (property.PropertyType == typeof(string))
        {
            // Do not include emptry strings
            property.ShouldSerialize = instance =>
            {
                return !string.IsNullOrWhiteSpace(instance.GetType().GetProperty(member.Name).GetValue(instance, null) as string);
            };
        }
        else if (property.PropertyType == typeof(DateTime))
        {
            // Do not include zero DateTime
            property.ShouldSerialize = instance =>
            {
                return Convert.ToDateTime(instance.GetType().GetProperty(member.Name).GetValue(instance, null)) != default(DateTime);
            };
        }
        else if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType))
        {
            // Do not include zero-length lists
            switch (member.MemberType)
            {
                case MemberTypes.Property:
                    property.ShouldSerialize = instance =>
                    {
                        var enumerable = instance.GetType().GetProperty(member.Name).GetValue(instance, null) as IEnumerable;
                        return enumerable != null ? enumerable.GetEnumerator().MoveNext() : false;
                    };
                    break;
                case MemberTypes.Field:
                    property.ShouldSerialize = instance =>
                    {
                        var enumerable = instance.GetType().GetField(member.Name).GetValue(instance) as IEnumerable;
                        return enumerable != null ? enumerable.GetEnumerator().MoveNext() : false;
                    };
                    break;
            }
        }
        return property;
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以按如下方式使用:

JsonConvert.SerializeObject(o,
    Newtonsoft.Json.Formatting.None,
    new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Ignore,
        ContractResolver = ShouldSerializeContractResolver.Instance
    });
Run Code Online (Sandbox Code Playgroud)