前言
串接第三方 API,十之八九會遇到字串狀態碼。
以大家都串過的第三方金流服務來說,訂單的付款狀態就是一串小寫字串:
created → pending → paid → refunded → (failed / expired)
一開始 domain model 我就直接用 string 存,然後就踩雷了。
把 API 的「操作狀態 success」塞進了「付款狀態」欄位,編譯器一聲都沒吭。
直到後來查資料,才發現欄位裡躺著一個根本不在狀態清單上的值。
那就改成 enum 吧。但一想到要改 enum,通常會冒出三個顧慮:
- API 回傳的 JSON 會從
"pending"變成數字2,這就把既有契約給破壞了。而且數字很難讀,前端得另外拿對照表才知道2是什麼;要是資料庫也跟著存數字,撈出來一排2、4,根本不知道自己在看什麼。 - Swagger / Scalar 文件裡看到的也是數字,不是有意義的字串。
- 資料庫欄位型別要不要跟著改?會不會需要 migration?
這篇就來把 .NET 9 新增的 [JsonStringEnumMemberName] 講清楚,一個內建 attribute 就能把這三個顧慮一次解掉。順便整理一下最容易踩雷的「兩條序列化管線」跟 query 參數的陷阱。
2026/7/9大約 9 分鐘