【C#】JSON – Serialize Enum to String

先來定義一下 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

分類: C#

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *