【发布时间】:2023-04-07 16:54:01
【问题描述】:
我编写了一个 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
}
我希望看到的输出:
{}
我该怎么做才能使属性被省略而不是为空?
P.S.:我已经阅读了条件属性序列化,但是 ShouldSerialize 方法不适合我的情况,我还没有弄清楚如何在我的情况下使用 IContractResolver。
【问题讨论】: