C#序列化枚举为字符串和自定义转换器

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 库都为此提供了一个转换器,分别为 JsonStringEnumConverterStringEnumConverter。下面来看看它们的用法。

2、基于标注的方式

.Net 标准库和 Newtonsoft 库都提供了一个转换器特性 JsonConverterAttribute,我们可以用它来选择性地标注要序列化为字符串形式的枚举属性或类型。

标注枚举
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会敲键盘的肘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值