JsonConvert:如何忽略值为特定数字的整数类型

Joh*_*ell 5 c# json

有没有办法告诉 JsonConvert 在整数类型值具有特定值时忽略它们?我想使用整数类型的 minValue 而不是 0 作为默认类型,因为 0 是有效值。

Evk*_*Evk 6

Json.NET 会尊重System.ComponentModel.DefaultValue属性,所以你可以像这样做你想做的事:

class TestClass {
    [DefaultValue(int.MinValue)]
    public int Value { get; set; }
}

var ser = JsonConvert.SerializeObject(new TestClass() { Value = int.MinValue}, new JsonSerializerSettings
{
    DefaultValueHandling = DefaultValueHandling.Ignore
});
// serializes to empty object {}
Console.WriteLine(ser);

var ser = JsonConvert.SerializeObject(new TestClass() { Value = 0}, new JsonSerializerSettings
{
    DefaultValueHandling = DefaultValueHandling.Ignore
});
// serializes to {"Value" : 0}
Console.WriteLine(ser);
Run Code Online (Sandbox Code Playgroud)

如果你不想装饰任何东西,你可以使用自定义合约解析器:

class IntMinValueContractResolver : DefaultContractResolver {
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) {
        var prop = base.CreateProperty(member, memberSerialization);
        if (prop.PropertyType == typeof(int)) {
            // for int properties, set default value and ignore it when serializing
            // while populating while deserializing
            prop.DefaultValue = int.MinValue;
            prop.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
        }
        return prop;
    }
}

JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
    ContractResolver = new IntMinValueContractResolver()
};
// serializes to empty object {}
var ser = JsonConvert.SerializeObject(new TestClass() { Value = int.MinValue});
Run Code Online (Sandbox Code Playgroud)