Json.NET StringEnumConverter 未按预期工作

js

1个回答

写回答

✔️✔️

2025-12-10 03:02

+ 关注

JS
JS

JSon.NET StringEnumConverter 是一个在 JSON 序列化和反序列化过程中使用的转换器,用于处理枚举类型的字符串表示。然而,有时候我们可能会遇到使用 StringEnumConverter 后未按预期工作的情况。本文将介绍一些常见的问题,并提供解决方案和案例代码。

问题一:枚举成员未正确转换

有时候,当我们使用 StringEnumConverter 进行序列化和反序列化时,枚举成员可能无法正确地转换为字符串。这通常是因为枚举成员的命名与 JSON 中的字符串表示不匹配。

解决方案一:使用 EnumMemberAttribute

可以通过在枚举成员上使用 EnumMemberAttribute 来指定其在 JSON 中的字符串表示。这样,StringEnumConverter 将根据 EnumMemberAttribute 中指定的值进行转换。

csharp

public enum Gender

{

[EnumMember(Value = "男")]

Male,

[EnumMember(Value = "女")]

Female

}

// 使用 StringEnumConverter 进行序列化和反序列化

var settings = new JSonSerializerSettings

{

Converters = new List<JSonConverter> { new StringEnumConverter() }

};

var JSon = JSonConvert.SerializeObject(Gender.Male, settings); // 输出 "男"

var gender = JSonConvert.DeserializeObject<Gender>(JSon, settings); // 输出 Gender.Male

问题二:大小写不敏感

默认情况下,StringEnumConverter 是大小写不敏感的,即枚举成员的字符串表示与 JSON 中的字符串表示在大小写上不需要完全匹配。这可能导致一些意外的行为。

解决方案二:设置 StringEnumConverter 的 NamingStrategy

可以通过设置 StringEnumConverter 的 NamingStrategy 属性来控制大小写敏感性。可以使用 SnakeCaseNamingStrategy 来保持大小写的一致性。

csharp

public enum Fruit

{

Apple,

Banana,

Orange

}

// 使用 SnakeCaseNamingStrategy 保持大小写一致

var settings = new JSonSerializerSettings

{

Converters = new List<JSonConverter> { new StringEnumConverter { NamingStrategy = new SnakeCaseNamingStrategy() } }

};

var JSon = JSonConvert.SerializeObject(Fruit.Apple, settings); // 输出 "Apple"

var fruit = JSonConvert.DeserializeObject<Fruit>(JSon, settings); // 输出 Fruit.Apple

问题三:自定义字符串表示

有时候,我们可能希望使用自定义的字符串表示来表示枚举成员,而不是使用枚举成员的名称。这在一些特殊情况下非常有用,比如国际化。

解决方案三:使用自定义转换器

可以自定义一个继承自 StringEnumConverter 的转换器,并在其中实现自定义的字符串表示逻辑。

csharp

public class CustomStringEnumConverter<T> : StringEnumConverter where T : struct, Enum

{

public override object ReadJSon(JSonReader reader, Type objectType, object existingValue, JSonSerializer serializer)

{

var value = reader.Value.ToString();

foreach (var enumValue in Enum.GetValues(typeof(T)))

{

if (enumValue.ToString().Equals(value, StringComparison.OrdinalIgnoreCase))

{

return enumValue;

}

}

return base.ReadJSon(reader, objectType, existingValue, serializer);

}

public override void WriteJSon(JSonWriter writer, object value, JSonSerializer serializer)

{

var enumValue = (Enum)value;

var stringValue = GetcustomStringValue(enumValue); // 自定义的字符串表示逻辑

writer.WriteValue(stringValue);

}

private string GetcustomStringValue(Enum enumValue)

{

// 根据枚举值返回自定义的字符串表示

// 这里省略具体实现

return string.Empty;

}

}

// 使用自定义转换器进行序列化和反序列化

var settings = new JSonSerializerSettings

{

Converters = new List<JSonConverter> { new CustomStringEnumConverter<Gender>() }

};

var JSon = JSonConvert.SerializeObject(Gender.Male, settings); // 输出 "CustomStringValue"

var gender = JSonConvert.DeserializeObject<Gender>(JSon, settings); // 输出 Gender.Male

在本文中,我们介绍了 JSon.NET StringEnumConverter 未按预期工作的一些常见问题,并提供了解决方案和案例代码。通过使用 EnumMemberAttribute、设置 NamingStrategy 或自定义转换器,我们可以解决枚举类型的字符串表示问题,并实现预期的功能。希望本文对您有所帮助!

举报有用(0分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号