如何用JSON.NET将枚举序列化为无引号字符串?
解决JSON.NET枚举序列化为无引号字符串的问题
刚好之前也碰到过类似的需求,先提前说一句:你想要的{ "Gender": Male }其实不符合标准JSON规范——JSON里的字符串必须带双引号,不带引号的只能是布尔值、数字、null或者属性名。但既然你有这个特殊场景的需求,咱们可以通过自定义JSON转换器来实现。
第一步:写一个自定义的枚举转换器
我们需要继承JSON.NET的JsonConverter类,重写序列化逻辑,直接输出枚举的名称而不套引号:
public class UnquotedStringEnumConverter : JsonConverter { public override bool CanConvert(Type objectType) { // 判断当前类型是否是枚举 return objectType.IsEnum; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // 获取枚举对应的字符串名称 string enumName = Enum.GetName(value.GetType(), value); // 直接写入原始字符串,不添加引号 writer.WriteRawValue(enumName); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 处理反序列化:把无引号的字符串转成枚举值 if (reader.TokenType == JsonToken.String || reader.TokenType == JsonToken.PropertyName) { string enumValue = reader.Value.ToString(); return Enum.Parse(objectType, enumValue); } throw new JsonSerializationException($"解析枚举{objectType.Name}时遇到意外的Token类型:{reader.TokenType}"); } }
第二步:把转换器用起来
有两种方式可以应用这个自定义转换器:
方式一:给单个属性加特性
把原来的StringEnumConverter替换成咱们自己写的就行:
public enum Gender { Male, Female } public class Test { [JsonConverter(typeof(UnquotedStringEnumConverter))] public Gender Gender { get; set; } }
方式二:全局配置所有枚举都用这个规则
如果你的项目里所有枚举都需要输出无引号的格式,可以在序列化时全局添加转换器:
var settings = new JsonSerializerSettings(); settings.Converters.Add(new UnquotedStringEnumConverter()); var testObj = new Test { Gender = Gender.Male }; string json = JsonConvert.SerializeObject(testObj, settings); // 输出结果就是你想要的:{"Gender":Male}
最后提醒一下
这种非标准的JSON格式,大部分通用的JSON解析器可能无法正常解析,所以一定要确认下游的系统或者工具能处理这种格式再用哦。不过反序列化的逻辑我们已经在转换器里处理好了,只要输入是这种无引号的格式,就能正常转成枚举值。
内容的提问来源于stack exchange,提问作者user3237295
相关产品推荐
相关产品推荐

