先來定義一下 object 跟 enum
public class Book
{
public string Author { get; set; }
public BookType BookType { get; set; }
}
public enum BookType
{
Fantasy = 1,
Crime = 2,
Romance = 3
}
看一下平常我們使用的序列化方法
//System.Text.Json
JsonSerializer.Serialize(new Book() { BookType = BookType.Crime });
//Newtonsoft.Json
JsonConvert.SerializeObject(new Book() { BookType = BookType.Crime })
Output:會直接將 Crime 自動變成數值 2 輸出
{"Author":null,"BookType":2}
如果要 out string 有以下幾種方法
方法一:在 object 的 property 上面直接加 Attribute
//System.Text.Json
[JsonConverter(typeof(JsonStringEnumConverter))]
public BookType BookType { get; set; }
//Newtonsoft.Json
[JsonConverter(typeof(StringEnumConverter))]
public BookType BookType { get; set; }
Output:會直接輸出 Crime
{"Author":null,"BookType":"Crime"}
方法二:在 Enum 加 Attribute
//System.Text.Json
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum BookType
{
Fantasy = 1,
Crime = 2,
Romance = 3
}
//Newtonsoft.Json
[JsonConverter(typeof(StringEnumConverter))]
public enum BookType
{
Fantasy = 1,
Crime = 2,
Romance = 3
}
Output:會直接輸出 Crime
{"Author":null,"BookType":"Crime"}
方法三:
如果確定用到的地方都是要 output string,那就可以放心用剛剛提到的第一、二種方法。
否則則使用此方法,避免影響到其他使用端。
//System.Text.Json
public string SerializeWithEnumString(object obj)
{
JsonSerializerOptions options = new JsonSerializerOptions();
options.Converters.Add(new JsonStringEnumConverter());
return JsonConvert.SerializeObject(obj, converter);
}
//Newtonsoft.Json
public string SerializeWithEnumString(object obj)
{
StringEnumConverter converter = new StringEnumConverter();
return JsonConvert.SerializeObject(obj, converter);
}
SerializeWithEnumString(new Book() { BookType = BookType.Crime })
Output:
{"Author":null,"BookType":"Crime"}
方法四:
如果是使用 .Net 框架,可以直接在 Startup 注入
//System.Text.Json
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
//Newtonsoft.Json
services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(new StringEnumConverter());
});
補充:System.Text.Json 要 .NET Core 3.0 開始才有
參考資料:https://learn.microsoft.com/zh-tw/aspnet/core/web-api/advanced/formatting?view=aspnetcore-7.0