我写了一个Json.NET转换器,将所有设置的标志输出为数组。
enum SampleEnum
{
None = 0,
ValueA = 2,
ValueB = 4
}
SampleEnum flags = SampleEnum.ValueA | SampleEnum.ValueB;
// JSON: ["ValueA", "ValueB"]
如果flags
是SampleEnum.None
,则该属性不应被序列化。因此,我不会将任何内容写入JsonWriter。以下是转换器的WriteJson方法的代码。
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value is SampleEnum enumValue)
{
IEnumerable<SampleEnum> setFlags = GetSetFlags<SampleEnum>(enumValue);
IEnumerable<string> flagNames = setFlags
.Where(flag => flag != SampleEnum.None) // Filter out 'None'
.Select(flag => flag.ToString());
if (flagNames.Any())
{
JArray jArray = JArray.FromObject(flagNames, serializer);
jArray.WriteTo(writer);
}
// Else omit this property
}
}
然而,如果我的类中有一个类型为SampleEnum的属性,并且其值为SampleEnum.None
,则该属性将被序列化,JSON值为null。
class SerializedClass
{
[JsonConverter(typeof(ArrayEnumConverter))]
public SampleEnum EnumValue { get; set; }
}
SerializedClass obj = new SerializedClass
{
EnumValue = SampleEnum.None
};
string json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
输出结果如下:
{
"EnumValue": null
}
The output I wish to see:
{}
如何避免属性为null而被省略?
附注:我已经了解了有关条件属性序列化的知识,但在我的情况下ShouldSerialize方法并不适用,而且我还没有弄清楚如何在我的情况下使用IContractResolver。