c# - System.Text.Json - 将第三方枚举数组序列化为字符串数组

标签 c# .net enums .net-6.0 system.text.json

<分区>

假设我有以下 DTO:

public class FooDto
{
    public string Bar { get; set; }
    public DayOfWeek[] Days { get; set; }
}

为了符合相应的API,这个DTO需要像这样序列化成json:

{
    "bar": "someString",
    "days": ["Monday", "Friday", "Sunday"]
}

如果没有任何进一步的操作,同一个 DTO 将像这样序列化:

{
    "bar": "someString",
    "days": [1, 5, 0]
}

我的问题:
有没有一种方法可以使用 System.Text.Json 将第三方枚举数组(如 System.DayOfWeek)序列化为字符串值数组?我特别寻找使用 json.net (Newtonsoft) 的解决方案。


我的想法没有实现:

  • 使用 [JsonConverter(typeof(JsonStringEnumConverter))] 不适用于数组。
  • 在这种情况下,建议将注释直接放在枚举本身之上。这是不可能的,因为它是第三方枚举。
  • 我不能简单地为 System.DayOfWeek 创建一个“代理”,因为枚举不支持继承。
  • 我可以创建自己的 DayOfWeekDto 并编写一个从 System.DayOfWeekDayOfWeekDto 的映射器,反之亦然,但是这个“解决方案”没有看起来一点也不优雅。

非常欢迎不包含 Newtonsoft 的简单解决方案的想法:)

最佳答案

好吧,这不是您问题的准确答案,还有其他人可能不同意的更多建议。

经验告诉我,在第 3 方中使用枚举会导致很多麻烦。

例如,如果第 3 方返回一个对象的状态,然后在您尝试反序列化它时添加一个不在您的 Enum 中的新状态,您的系统可能会崩溃(即使您只是忽略它因为它不是您感兴趣的状态)。

那么有什么选择呢?

很简单,创建您的 Enum 但不要将其用于属性类型,而是将您的属性类型设置为 string。当分配或比较您的属性类型时,您将使用 MyEnum.SomeValue.ToString()。本质上,您的 Enum 只是变成了一组常量。

这有一个额外的好处,即当您序列化时,您将获得 JSON 中的字符串值。

关于c# - System.Text.Json - 将第三方枚举数组序列化为字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73568581/

相关文章:

c# - 这是一个危险的锁定模式吗?

c# - 在一行中设置多个变量

C++ 在枚举中有数组值?

ios - 我如何在字符串支持的枚举数组上使用字符串函数?

c# - 发生异常时关闭数据库连接的正确方法

c# - 使用 Roslyn 如何使用指令更新类?

c# - 使用反射计算代码行数的简单方法

c# - DateTime.TryParse 或 Datetime.TryParseExact?

c# - Windows 窗体应用程序中窗体加载期间触发的 SelectedValueChange() 事件

c# - 如何将通用 Tryparse 与枚举一起使用?