C#序列化枚举为字符串和自定义转换器
我所做的项目是需要调用业务算法的,算法中有一个入参是油品的性质,这个性质有名称、编码、类型等属性,其中类型是固定质量性质、体积性质和其他性质这三种,所以我把其作为枚举类型。问题也由此产生,默认情况下,枚举是以其整数形式进行 JSON 序列化,这就需要同研发算法的同事约定好数值的含义。但是经过协商,算法同事要求我们传递成字符串。因此,我们希望它们在一些情况下以字符串的形式进行序列化。本文将讲解实现这一目标的各种方法。
1、枚举序列化的默认行为
首先,我们有一个性质类:
public class Property
{
public string Code { get; set; }
public string Name { get; set; }
public PropertyType ProType { get; set; }
}
public enum PropertyType
{
Volume,
Weight,
Other
}
我们用 System.Text.Json
中的 Serialize
方法序列化一个 Property
对象:
using System.Text.Json;
var json = JsonSerializer.Serialize(new Property
{
Code = "DEN",
Name = "密度",
ProType = PropertyType.Volume
});
Console.WriteLine(json);
可以看到这个对象序列化为 Json 后的字符串:
{ "Code": "DEN", "Name": "密度", "ProType": 0}
正如我们所看到的,枚举属性的值(PropertyType.Volume
)被序列化为 JSON 字符串后表现为一个整数(0
)。
作为序列化结果 JSON 的消费者,在没有文档的情况下,无法知道这个整数代表的业务含义。
所以,问题来了。如何将枚举属性序列为更直观的字符串形式呢?即,如何将上面示例中的对象序列化为:
{ "Code": "DEN", "Name": "密度", "ProType": "Volume" }
要把枚举序列化为字符串,.Net 标准库 System.Text.Json
和 Newtonsoft 库都为此提供了一个转换器,分别为 JsonStringEnumConverter
和 StringEnumConverter
。下面来看看它们的用法。
2、基于标注的方式
.Net 标准库和 Newtonsoft 库都提供了一个转换器特性 JsonConverterAttribute
,我们可以用它来选择性地标注要序列化为字符串形式的枚举属性或类型。