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);
}
}
吗?如果是这样,我需要覆盖什么来获得我想要的行为?
我希望避免将转换器附加到包含此属性的类,因为那时我必须手动序列化整个事情,这很痛苦。
答案 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}