【问题标题】:Deserializing Enums C#反序列化枚举 C#
【发布时间】:2020-05-12 14:13:02
【问题描述】:

是否可以将我的枚举字符串动态反序列化为枚举。

在我的 API 和使用我的 API 的应用程序中,我有这个类。

 public static class ErrorCodes
    {
        public enum General
        {
            INCORRECT_PASSWORD,
            INCORRECT_USERNAME,
            INVALID_USERNAME
        }

        public enum ERRORTYPE_1
        {
            DATESPAN_NOT_PERMITTED
        }

        public enum ERRORTYPE_2
        {
            PERIOD_NOT_ALLOWED
        }
    }

在我的 API 中有这个。这是以 JSON 形式发送回我的应用程序的内容。

public class Error
{

    public string Message { get; set; }
    public Enum Code { get; set; }

    public Error() { }

    public Error(Enum code)
    {
        this.Code = code;
    }

    public Error(string message, Enum code)
    {
        this.Message = message;
        this.Code = code;
    }
}

然后我可以像这样返回我的错误。

new Error(ErrorCodes.ERRORTYPE_2.PERIOD_NOT_ALLOWED)

有没有办法让我的枚举分开?我觉得超级长的枚举错误代码列表不是很干净或可维护。

这篇博文几乎是我想做的,但对枚举进行了更多抽象。 https://bytefish.de/blog/enums_json_net/

【问题讨论】:

  • 不清楚您期望在这里发生什么。您希望 JSON 是什么样子?
  • 我想在客户端将字符串 json 反序列化为适当的枚举类型。我将枚举的字符串值和错误对象中的字符串消息作为 JSON 传递。
  • 这组可能的枚举可以有重复的值名称INCORRECT_PASSWORD, DATESPAN_NOT_PERMITTED, ..., ,还是你确定它们是唯一的?
  • 这有关系吗?目前它们是独一无二的。
  • 如果它们不是唯一的,您将无法仅从枚举值字符串中反序列化 JSON。或者,如果您愿意封装枚举类型信息,请参见例如Deserialize specific enum into system.enum in Json.Net.

标签: c# json enums json.net


【解决方案1】:

是否可以将我的枚举字符串动态反序列化为枚举?

如果您在 dotnet-core 上构建 Web API 项目,那么您链接到的博客中的解决方案效果很好,尽管我会使用标准的 System.Text.Json 库(自核心 3.0 起):

using System.Text.Json.Serialization;

namespace Foobar
{
    [JsonConverter(typeof(JsonStringEnumConverter))]
    public enum Foo
    {
        Bar = 0,
        Baz = 1
    }
}

这会将枚举Foo.Bar 转换为客户端上的"Bar" 和服务器上的"Bar" -> Foo.Bar

有没有办法让我的枚举分开?我觉得超级长的枚举错误代码列表不是很干净或可维护。

我不知道我是否可以回答这部分,因为看起来你已经用你的类结构做到了。我对您提供的代码是您的目标还是您当前的代码感到困惑。


有关枚举序列化和反序列化的更多信息,请查看post

【讨论】:

    【解决方案2】:

    当您的 Enum 值由 JSON 转换器反序列化并发送回应用程序时,枚举值将转换为 Int32 类型。为了能够将intstring 值转换为Enum 类型,您应该知道要将值转换/反序列化为的枚举类型。因此,您要么需要将所有错误代码声明为单个枚举类型的一部分(这样你就知道目标枚举类型),要么在响应中包含 typeof 枚举值,这样就可以做到Enum.Parse(typeof(TargetEnumType),enumValue)。如果您使用的是 C# 8.0,后一种方法可以通过更新您的 Error 类来实现,如下所示

    public class Error<TEnum> where TEnum:Enum
    {
    
        public string Message { get; set; }
        public TEnum Code { get; set; }
    
    
        public Type GetEnumType()
        {
            return Code?.GetType();
        }
    
        public Error() { }
    
        public Error(TEnum code)
        {
            this.Code = code;
        }
    
        public Error(string message, TEnum code)
        {
            this.Message = message;
            this.Code = code;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-14
      • 2019-05-31
      • 2015-07-26
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 2012-10-24
      相关资源
      最近更新 更多