我有以下代码:
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?是否需要对这里的对象进行其他检查?
答案 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);
}