gpt4 book ai didi

c# - 自定义 Json.NET 转换器不应序列化属性

转载 作者:行者123 更新时间:2023-12-05 03:04:46 24 4
gpt4 key购买 nike

我编写了一个 Json.NET 转换器,它将所有设置的标志输出为一个数组。

enum SampleEnum
{
None = 0,
ValueA = 2,
ValueB = 4
}

SampleEnum flags = SampleEnum.ValueA | SampleEnum.ValueB;
// JSON: ["ValueA", "ValueB"]

现在,如果 flagsSampleEnum.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
}

我希望看到的输出:

{}

我该怎么做才能使该属性被省略而不是为 null?

P.S.:我读过关于条件属性序列化的内容,但是 ShouldSerialize 方法不适合我的情况,我还没有想出如何在我的情况下使用 IContractResolver。

最佳答案

A custom JsonConverter无法阻止其值被序列化,因为引用它的属性名称在调用转换器时已经写出。在 Json.NET 的体系结构中,包含类型有责任决定要序列化其属性的;然后值转换器决定如何序列化正在写入的值。

作为替代方案,设置 DefaultValueHandling.Ignore可用于跳过 enum 成员的序列化,即使在应用转换器时也是如此。由于 SampleEnum.None 的值为 0,因此它是标志枚举的默认值。具有此值的成员在启用设置时将被跳过,无论是否应用转换器。

您可以通过 JsonPropertyAttribute.DefaultValueHandling 应用它来启用 DefaultValueHandling :

public class SerializedClass
{
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonConverter(typeof(ArrayEnumConverter))]
public SampleEnum SampleEnum { get; set; }
}

fiddle 示例 here .

顺便说一句,您应该考虑用 [Flags] 标记您的 SampleEnum属性:

[Flags]
public enum SampleEnum
{
None = 0,
ValueA = 2,
ValueB = 4
}

这是 recommended best practice对于标志枚举:

Designing Flag Enums

√ DO apply the System.FlagsAttribute to flag enums. Do not apply this attribute to simple enums.

关于c# - 自定义 Json.NET 转换器不应序列化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52671471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com