【发布时间】:2017-07-10 23:27:29
【问题描述】:
我有以下代码:
var data = new {
name = "Jon Doe",
properties = new
{
homes = new Dictionary<string, string>()
},
age = 34
}
var settings = new JsonSerializerSettings {
ContractResolver = new MyResolver()
};
var serializationResult = JsonConvert.SerializeObject(data, settings)
Json.Net 合约解析器MyResolver 定义如下:
class MyResolver : DefaultContractResolver {
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (property.PropertyType.GetTypeInfo().IsGenericType &&
typeof(IDictionary).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition()))
{
property.ShouldSerialize =
instance =>
{
var value = instance.GetType().GetProperty(property.PropertyName).GetValue(instance, null);
return (value as IDictionary).Count > 0;
};
}
return property;
}
}
我的问题是序列化的json结果如下:
{
"name": "Jon Doe",
"properties": {},
"age": 34
}
但是我想去掉"properties": {}这个属性,也就是说我想获取json
{
"name": "Jon Doe",
"age": 34
}
我已经尝试摆脱这些在删除其子项后导致为空的属性,但没有成功,我该如何做到这一点?
【问题讨论】:
-
你在这里省略了空字典(
homes属性),你想省略它的父级吗? -
你有没有尝试使用settings.NullValueHandling = NullValueHandling.Ignore;
-
我有 DTO,它可能在任何深度级别都有嵌套属性,即字典。我想根据某些条件删除该 Dictionary 属性,如果某些父属性在该操作后为空,我也想删除它们。
-
我尝试使用 settings.NullValueHandling = NullValueHandling.Ignore,但我不想忽略所有默认值。
-
那么如何定义要排除的属性?