在大多数版本的 ASP.NET Web API 中,默认的 JSON 序列化器是 JSON.NET。
你可以结合两件事来实现你所需要的:
- 在 Web API 序列化程序配置中指定 default value handling,如下所示:
config.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Ignore
- 使用DefaultValueAttribute 指定不应该序列化的默认值,如果不是“通常的默认值”:null 表示对象和可空值,0 表示数字,等等。
对于您的特定枚举情况,您可以定义枚举中的默认值,即使它不是 0。
例如,如果你想跳过一个类中ExpiryPeriod属性的序列化,当它的值为30时,除了设置DefaultValueHandling.Ignore之外,像这样装饰属性
public class Voucher
{
[DefaultValue(30)]
public int ExpiryPeriod { get; set; }
}
注意:如果要使用 JSON.NET 反序列化为默认值,则必须使用 DefaultValueHandling.IgnoreAndPopulate。这意味着,如果在反序列化 JSON 文本时未找到该属性值,则会使用指定的默认值 30 创建该属性。
枚举值的完整示例:
using System;
using System.ComponentModel;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public class Program
{
public static void Main()
{
var tshirts = new TShirt[]
{
new TShirt { Model = "Hawaii 2", Size = Size.M },
new TShirt { Model = "La casa de papel", Size = Size.XL },
};
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
settings.Converters.Add(new StringEnumConverter());
foreach(var tshirt in tshirts)
{
Console.WriteLine("Original T-Shirt");
Console.WriteLine(tshirt);
Console.WriteLine();
var serialized = JsonConvert.SerializeObject(tshirt, Formatting.Indented, settings);
Console.WriteLine("Serialized T-Shirt");
Console.WriteLine(serialized);
Console.WriteLine();
Console.WriteLine("Deserialized T-Shirt");
var deserialized = JsonConvert.DeserializeObject<TShirt>(serialized, settings);
Console.WriteLine(deserialized);
Console.WriteLine();
Console.WriteLine();
}
}
public enum Size
{
XL,
L,
M,
X,
XS
}
public class TShirt
{
public string Model { get; set; }
[DefaultValue(Size.M)]
public Size Size { get; set; }
public override string ToString()
{
return $"· Model: {Model}\r\n· Size: {Size}";
}
}
}
哪个输出:
Original T-Shirt
· Model: Hawaii 2
· Size: M
Serialized T-Shirt
{
"Model": "Hawaii 2"
}
Deserialized T-Shirt
· Model: Hawaii 2
· Size: M
Original T-Shirt
· Model: La casa de papel
· Size: XL
Serialized T-Shirt
{
"Model": "La casa de papel",
"Size": "XL"
}
Deserialized T-Shirt
· Model: La casa de papel
· Size: XL
如您所见,即使Seize.M 不是枚举的默认 (0) 值,它也会从序列化中跳过并用于反序列化 json 中缺少的属性。