System.Text.Json:当json配置具有通用JsonStringEnumConverter时,如何将单个枚举序列化为数字[重复]

Posted

技术标签:

【中文标题】System.Text.Json:当json配置具有通用JsonStringEnumConverter时,如何将单个枚举序列化为数字[重复]【英文标题】:System.Text.Json: How to serialize a individual enum as number when the json configuration has a general JsonStringEnumConverter [duplicate] 【发布时间】:2021-11-11 15:12:22 【问题描述】:

System.Text.Json 默认为 enum 序列化编号。在我的情况下,我需要 Startup.cs 中的字符串,我添加了一个转换器以将所有 enum 序列化为字符串,如此处所示。

 .AddJsonOptions(
           c =>
           
             c.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
          
        );

但我有一个特定的枚举,我需要将其序列化为数字。

public enum fareStatus

    None = 0,
    Club = 1,
    NoClub = 2

在这种情况下,我想得到 0,1,2 而不是字符串,

在这种情况下可能吗? 谢谢

【问题讨论】:

如果我没看错:docs.microsoft.com/en-us/dotnet/standard/serialization/… 那么应用于该枚举类型属性的转换器应该优先于列表中的转换器。但不要相信我的话。没试过。 感谢您的回答,我尝试使用其他转换器但对我不起作用,是否有转换器可以将序列化恢复为其默认值?如果存在,那应该是一个不错的解决方案。如果不是,我想我需要创建一个自定义转换器 您可以发布您尝试序列化的对象吗? 使用new OptOutJsonConverterFactory(new JsonStringEnumConverter(), typeof(fareStatus)),其中OptOutJsonConverterFactory 来自this answer 到Exclude an enum property of a Model from using the JsonStringEnumConverter which is globally set at the Startup?。 【参考方案1】:

如果你想从枚举中获取数字,试试这个

    var item = new Item  Status = fareStatus.NoClub ;
    var options = new JsonSerializerOptions();
    var json= JsonSerializer.Serialize(item,options);

json

"Status":2

试试这段代码

    var options = new JsonSerializerOptions();
    options.Converters.Add(new JsonStringEnumConverter());
    var json= JsonSerializer.Serialize(item,options);

    item=JsonSerializer.Deserialize<Item>(json,options);

json

"Status":"NoClub"

public class Item

    public fareStatus Status get; set;

【讨论】:

以上是关于System.Text.Json:当json配置具有通用JsonStringEnumConverter时,如何将单个枚举序列化为数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章

System.Text.Json 中的字符编码

使用 System.Text.Json 从 json 文件读取到 IEnumerable

System.Text.Json.JsonSerializer.Serialize 返回空 Json 对象“”[重复]

使用 System.Text.Json 修改 JSON 文件

如何在反序列化之前使用 System.Text.Json 验证 JSON

如何使用 System.Text.Json 忽略错误值