默认情况下,Newtonsoft.Json 库序列化和反序列化 JSON 到 .NET 类型的时候,对于枚举值,使用的是整数。然而,在公开 JSON 格式的 API 时,整数会让 API 不易于理解,也不利于扩展和兼容。
那么,如何能使用字符串来序列化和反序列化 JSON 对象中的枚举呢?
—— 使用转换器(JsonConverter
)。
Newtonsoft.Json 中自带了一些转换器,在 Newtonsoft.Json.Converters
命名空间下。其中枚举的转换是 StringEnumConverter
,我们只需要将其标记在属性上即可。
如下面的代码所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | using Newtonsoft.Json; using Newtonsoft.Json.Converters; namespace Walterlv.Models { public class Foo { [JsonConverter(typeof(StringEnumConverter), true)] public DoubiLevel Level { get; set; } } public enum DoubiLevel { None, ABit, Normal, Very, Extreme, } } |
---|
对于“逗比程度”枚举,增加了转换器后,这个对象的序列化和反序列化将成:
1 2 3 | { "Level": "very" } |
---|
那个 StringEnumConverter
后面的参数 true
表示使用 camelCase
来格式化命名,即首字母小写。
当然,如果你希望属性名也小写的化,需要加上额外的序列化属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 | using System.Runtime.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; …… [DataContract] public class Foo { [DataMember(Name = "level")] [JsonConverter(typeof(StringEnumConverter), true)] public DoubiLevel Level { get; set; } } …… |
---|
将序列化和反序列化成:
1 2 3 | { "level": "very" } |
---|
本文会经常更新,请阅读原文: https://blog.walterlv.com/post/newtonsoft-json-convert-enum-as-strings.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected]) 。