在您的 Enum 中添加 EnumMember 属性,指定序列化/反序列化过程的值。
public enum UserType
{
President,
VicePresident,
[EnumMember(Value = "chump")]
Citizen // Chump maps to Citizen, now.
}
当在您的 json 中,userType 属性等于 "Chump" 或 "Citizen" 时,属性 userType 将为 Citizen。
记得将System.Runtime.Serialization 引用添加到您的项目中。
编辑
我注意到EnumMember 属性的Value 属性的检查区分大小写。所以你不能使用"Chump",如果你的json中有"chump"。要解决此问题,您可以使用自定义StringEnumConverter。
public class UserTypeEnumConverter : StringEnumConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var userTypeType = typeof(UserType);
if (objectType == userTypeType)
{
var value = reader.Value.ToString().ToLower();
foreach (var item in Enum.GetNames(userTypeType))
{
var memberValue = GetEnumMemberValue(userTypeType.GetMember(item)[0]);
if (memberValue != null && memberValue.ToLower() == value)
{
return Enum.Parse(userTypeType, item);
}
}
}
return base.ReadJson(reader, objectType, existingValue, serializer);
}
}
private static string GetEnumMemberValue(MemberInfo memberInfo)
{
var attributes = memberInfo.GetCustomAttributes(typeof(EnumMemberAttribute), inherit: false);
if (attributes.Length == 0) return null;
return ((EnumMemberAttribute)attributes[0]).Value;
}
在上面的代码中,我只检查EnumMember 属性,因为默认StringEnumConvert 已经完成UserType 的成员不区分大小写检查。
请注意,由于检查,此转换器仅适用于您的 UserType 枚举:
var userTypeType = typeof(UserType);
if (objectType == userTypeType)
{
将JsonSerializerSettings初始化替换为:
internal static JsonSerializerSettings JsonSerializerSettings => new JsonSerializerSettings
{
Converters = new JsonConverter[]
{
new UserTypeEnumConverter()
},
Formatting = Formatting.Indented
};
我假设Vice-President 枚举器是VicePresident in UserType。