代码之家  ›  专栏  ›  技术社区  ›  Martyn C

自定义StringEnumConverter未拾取所有枚举

  •  0
  • Martyn C  · 技术社区  · 4 月前

    我有一个用于序列化和反序列化的记录包,它发布在我项目的私有GitHub Repo中。其中一个里面有许多枚举。我正在使用GraphQL后端,在GraphQL中,枚举被转换为大写,单词之间有下划线。

    为了解决这个问题,我创建了一个实现 StringEnumConverter 接受以下价值观 Regular REGULAR AnnualLeave ANNUAL_LEAVE 。这些似乎工作得很好,但我有一个状态枚举,它是 Draft ,但是,它根本不会通过转换器将其更改为 DRAFT .

    这是我的 WriteJson 负责该工作的方法:

    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
        {
            if (value is Enum enumValue)
            {
                var enumString = enumValue.ToString();
                var snakeCase = Regex.Replace(enumString, "([a-z])([A-Z])", "$1_$2").ToUpper();
                writer.WriteValue(snakeCase);
            }
            else
            {
                base.WriteJson(writer, value, serializer);
            }
        }
    

    我用断点做了一些调试,前两个,Regular和AnnualLeave很好地命中了断点,但由于某种原因,Draft没有。

    请问,有人能就为什么会发生这种情况提供任何帮助吗?

    1 回复  |  直到 4 月前
        1
  •  1
  •   Hans Kesting    4 月前

    对于Jsons,我使用以下JsonSerializer选项:

    using System.Text.Json;
    using System.Text.Json.Serialization;
    
    private static readonly JsonSerializerOptions JsonOptions = new()
    {
        WriteIndented = true,
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
        DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
        Converters = { new JsonStringEnumConverter(JsonNamingPolicy.SnakeCaseUpper) },
    };
    

    Json-序列化器选项:

    • 缩进以便于阅读。
    • 属性位于“camelCase”而不是“PascalCase”中。
    • 忽略引用类型和可为null的值类型的“null”值。
    • 枚举值为“UPPER_SNAKE_CASE”,而不是其int值。