【问题标题】:Omit empty dictionary and parent properties when serializing with Json.Net [duplicate]使用 Json.Net 序列化时省略空字典和父属性 [重复]
【发布时间】: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,但我不想忽略所有默认值。
  • 那么如何定义要排除的属性?

标签: c# json.net


【解决方案1】:

instance已经是指定的类型。您可以简单地投射:

instance =>
                {
                    var value = (IDictionary)instance;
                    return value != null && value.Keys.Count() > 0
                };

试试看是否可行。如果没有,请通过调试检查value 的内容是什么并回发。

编辑:我看到这是关于嵌套属性的。请提供继承类的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多