[英]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.