在某些条件下序列化时忽略属性

时间:2014-08-13 18:33:33

标签: c# serialization json.net

Json.net有一个非常有用的属性,可以在名为JsonPropertyAttribute的{​​{1}}上设置。如果你装饰这样的房产:

NullValueHandling

如果[JsonProperty(NullValueHandling=NullValueHandling.Ignore)] string MyProp { get; set; } 为空,则根本不会包含在输出中。

我想做类似的事情,但有不同的排除条件。例如 - 假设我们有一个枚举

MyProp

属性

public enum MyEnum { None = 0, Value1 = 1, Value2 = 2, Value3 = 4 };

然后,如果MyEnum MyProp { get; set; } ,我希望将MyProp完全排除在输入之外。

我知道一个解决方案是使用MyProp == MyEnum.None代替MyEnum?,然后我可以再次使用MyEnum,但我不能在这里使用nullable。我以为我可以使用NullValueHandling所以我试图将JsonConverter子类化(因为我希望它们理想地输出为字符串):

StringEnumConverter

我可以或者应该尝试继承 public class MyEnumConverter : Newtonsoft.Json.Converters.StringEnumConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(MyEnum); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // don't write if value is none var v = (MyEnum)value; if (v == MyEnum.None) { // what to do here? The two options below both include the property as null //writer.WriteNull(); //serializer.Serialize(writer, null); return; // just returning without doing anything will break the serialization } base.WriteJson(writer, value, serializer); } } 吗?如果是这样,我需要覆盖什么来获得我想要的行为?

我希望避免将转换器附加到包含此属性的类,因为那时我必须手动序列化整个事情,这很痛苦。

1 个答案:

答案 0 :(得分:7)

您可以使用签名为public bool ShouldSerialize*PropertyName*()的方法。

public enum MyEnum { None = 0, Value1 = 1, Value2 = 2, Value3 = 4 };

public class SomeClass
{
    public MyEnum MyProp { get; set; }
    public string Test = "aaaa";

    public bool ShouldSerializeMyProp()
    {
        return MyProp != MyEnum.None;
    }
}

var retVal1 = JsonConvert.SerializeObject(new SomeClass() { MyProp= MyEnum.None });
var retVal2 = JsonConvert.SerializeObject(new SomeClass() { MyProp = MyEnum.Value1 });

<强>输出:

retVal1:{"Test":"aaaa"}

retVal2:{"Test":"aaaa","MyProp":1}