【问题标题】:how to handle enums like strings and ints如何处理字符串和整数等枚举
【发布时间】:2021-04-05 17:40:49
【问题描述】:

我正在重写一个 api,从 newtonsoft.json 切换到 system.text.json,我遇到的一个问题是,在某些情况下,我们将枚举作为整数发送,有时作为字符串发送。

考虑这个例子:

{
"result":
{
"RequestTypeEnum":"Request.Get"
},
"resultTypeEnum": 0
}

如何在 system.text.json 中实现这一点? 我知道对于 pascal/camel 情况可以使用 Json 命名属性,但我不知道如何在同一响应中以不同方式处理枚举

【问题讨论】:

  • 为什么不使用枚举转换器而不是另一个?
  • @CaiusJard 我需要全局使用 enumconverter 因为我得到的输入几乎总是使用枚举作为字符串,响应有时是字符串有时是整数
  • 我的意思是您可以为每个属性使用不同的转换器,因此例如使用一个全局转换器作为一种方式,然后每个属性对所有不遵循全局规则的枚举使用不同的转换器

标签: c# json.net asp.net-core-3.0 system.text.json


【解决方案1】:

这可能不是完整的答案。

  1. 整数到枚举的转换会自动发生。

  2. 对于 Enum 的字符串,您必须编写自己的转换器。

以下是我尝试过的示例。

class Program
{
    static async Task Main(string[] args)
    {
        
        string data = @"{
                        ""result"":
                        {
                                        ""RequestTypeEnum"":""Option""
                        },
                        ""resultTypeEnum"": 2
                        }";
        TempJson jsonObj =  System.Text.Json.JsonSerializer.Deserialize<TempJson>(data);
        Console.WriteLine();
        Console.ReadLine();
    }

   

    public class TempJson
    {
        [System.Text.Json.Serialization.JsonPropertyName("result")]
        
        public ChildObj Result { get; set; }
        [System.Text.Json.Serialization.JsonPropertyName("resultTypeEnum")]
        public ResultEnumType ResultTypeEnum { get; set; }
    }

    public class ChildObj
    {
        [System.Text.Json.Serialization.JsonConverter(typeof(CategoryJsonConverter))]
        public ResultEnumType RequestTypeEnum { get; set; }
    }

    public class CategoryJsonConverter : JsonConverter<ResultEnumType>
    {
        public override ResultEnumType Read(ref Utf8JsonReader reader,
                                      Type typeToConvert,
                                      JsonSerializerOptions options)
        {
            var name = reader.GetString();

            return (ResultEnumType)Enum.Parse(typeToConvert, name);
        }

        public override void Write(Utf8JsonWriter writer,
                                   ResultEnumType value,
                                   JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToString());
        }
    }

    public enum ResultEnumType
    {
        Get,
        Post,
        Put,
        Delete,
        Option
    }
 }

【讨论】:

  • 其实你有点离题了。如果添加 jsonOptions.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());该应用程序将自动将枚举序列化为字符串。但是您的方法向我表明,我可以在需要它们的地方添加自定义转换器,以便在我的回复中我会对枚举进行不同的处理
猜你喜欢
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多