簡體   English   中英

枚舉響應是數值而不是字符串

[英]Enum response is numeric value and not string

對於我所有其他枚舉類 swagger 顯示字符串定義,但對於我在“ExceptionMiddleware”class 中使用的一個枚舉 class,它顯示數值。 但在 swagger 文檔示例中,它顯示了字符串值..

我的枚舉 class:

public enum ErrorCode
{
    Undefined = -1,
    None = 0,

    ContractNotFound = 1000
}

我的其他枚舉類之一沒有這個“問題”:

public enum ContractStatus
{
    Undefined = 0,
    Created = 1,
    Valid = 2,
    Invalid = 3
}

在此處輸入圖像描述

找不到合約時的結果:

在此處輸入圖像描述

我還必須添加 '[JsonPropertyName("errorCode")]' 以便屬性以小寫字母開頭。 對於我所有的其他型號,這不是必需的......

class:

public class ExceptionResponse
{
    [JsonPropertyName("errorCode")]  
    public ErrorCode ErrorCode { get; set; }

    [JsonPropertyName("errorCodeLabel")]
    public string ErrorCodeLabel { get; set; }

    [JsonPropertyName("errorMessage")]
    public string ErrorMessage { get; set; }
}

“Program.cs”中的配置:

o.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());

如果我刪除這個所有枚舉的顯示數值而不是字符串值。

我如何在我的“ExceptionMiddleware”class 中構建“ExceptionResponse”model:

var exceptionResponse = new ExceptionResponse()
        {
            ErrorCode = ErrorCode.Undefined,
            ErrorCodeLabel = ErrorCode.Undefined.ToString(),
            ErrorMessage = "A random message."
        };

如果有錯誤:

await httpContext.Response.WriteAsync(JsonSerializer.Serialize(exceptionResponse));

因為您是手動序列化,所以您正在繞過包含您的轉換器的已注冊中間件。 您需要將選項實例傳遞給包含轉換器的序列化調用。

var options = new JsonSerializerOptions();
options.Converters.Add(new JsonStringEnumConverter());

await httpContext.Response.WriteAsync(JsonSerializer.Serialize(exceptionResponse, options));

將序列化程序選項緩存為 static 字段被認為是最佳實踐,這樣您就不會在每次調用序列化時重新創建它們,因為這對舊版本的System.Text.Json有嚴重的性能影響。

public class ContainingClass
{
    private static readonly JsonSerializerOptions s_options = new()
    {
        Converters =
        {
            new JsonStringEnumConverter()
        }
    }
}

您可以將此屬性放在 Enum 聲明之上。 像這樣的東西

[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ErrorCode
{
    Undefined = -1,
    None = 0,

    ContractNotFound = 1000
}

請注意,這是針對 .net 核心 3 及更高版本。 內置轉換器的更多信息在這里: https://learn.microsoft.com/en-us/do.net/api/system.text.json.serialization.jsonstringenumconverter?view.net-7.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM