如何使用NewtonSoft库忽略空数组元素

时间:2019-06-26 08:10:42

标签: c# json.net

我有以下代码:

public City[] Cities { get; set; }

在城市班上,我有两个属性

public string Name { get; set; }
public string Code { get; set; }

当请求中的Cities字段为空时,我想用Newtonsoft隐藏它。

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public City[] Cities { get; set; }

但是我尝试的这段代码不起作用,因为Cities不为null,而是空的,并且请求在此数组中始终具有两个属性。

在这种情况下,我应该如何使用Newtonsoft?是否需要对这里的对象进行其他检查?

1 个答案:

答案 0 :(得分:3)

您应该在JSON.NET中使用Conditional Property Serialization。我认为如果该属性为空或为null,您将忽略它,因此,在包含Cities属性的类中添加此方法:

    // ignore a property on a condtion
    public bool ShouldSerializeCities() => Cities != null && Cities.Count > 0;

更新1:

如@DavidG所述,如果字符串字段(名称和代码)为null或为空,则上述解决方法将不会忽略它们。为此,您需要使用DefaultValue

像这样定义JsonConvert设置:

        var settings = new JsonSerializerSettings {
            NullValueHandling = NullValueHandling.Ignore,
            DefaultValueHandling = DefaultValueHandling.Ignore
        };

在所需的字段/属性上使用DefaultValue属性:

public class City
{
    [DefaultValue("")]
    public string Name
    {
        get;
        set;
    }

    [DefaultValue("")]
    public string Code
    {
        get;
        set;
    }
}

使用上面创建的设置序列化对象:

JsonConvert.SerializeObject(obj, settings) ;

例如,如果您的对象看起来像这样:

        var obj = new Foo{
            Cities = new  [] {
                new City() {Name = "A", Code = ""}
                , new City() {Name = "B", Code = "C"}
                , new City(){Name = "", Code = ""}
            }
        };

结果将是:

{
  "Cities": [
    {
      "Name": "A"
    },
    {
      "Name": "B",
      "Code": "C"
    },
    {}
  ]
}

I created a project on .NET Fiddle to see how it works.

如果您不喜欢创建新设置,仍然可以在ShuldSerializeMemberName类中使用City

public class City
{
   public string Name{get;set;}

   public bool ShouldSerializeName() => !string.IsNullOrEmpty(Name);
}