告诉Nancy将枚举序列化为字符串

Nancy默认情况下在生成JSON响应时将枚举序列化为整数。 我需要将枚举序列化为字符串。

有一种方法可以通过创建JavaScriptPrimitiveConverter来自定义Nancy的JSON序列化。 例如,这是我为ONE枚举自定义序列化所做的:

创建自定义类:

public class JsonConvertEnum : JavaScriptPrimitiveConverter { public override IEnumerable SupportedTypes { get { yield return typeof(MyFirstEnum); } } public override object Deserialize( object primitiveValue, Type type, JavaScriptSerializer serializer) { if (type == typeof(MyFirstEnum)) { var serialized = (string)primitiveValue; MyFirstEnum deserialized; if (Enum.TryParse(serialized, out deserialized)) { return deserialized; } else { return null; } } return null; } public override object Serialize( object obj, JavaScriptSerializer serializer) { if (obj is MyFirstEnum) { var deserialized = (MyFirstEnum)obj; var serialized = deserialized.ToString(); return serialized; } return null; } } 

在引导期间注册它:

 protected override void ApplicationStartup( Nancy.TinyIoc.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines) { base.ApplicationStartup(container, pipelines); Nancy.Json.JsonSettings.PrimitiveConverters.Add(new JsonConvertEnum()); } 

我需要为我的所有枚举做这个。

有更简单的方法吗?

我没有时间自己测试它,但以下代码应适用于所有Enum类型

 public class JsonConvertEnum : JavaScriptPrimitiveConverter { public override IEnumerable SupportedTypes { get { yield return typeof(Enum); } } public override object Deserialize( object primitiveValue, Type type, JavaScriptSerializer serializer) { if (!type.IsEnum) { return null; } return Enum.Parse(type, (string)primitiveValue); } public override object Serialize( object obj, JavaScriptSerializer serializer) { if (!obj.GetType().IsEnum) { return null; } return obj.ToString(); } } 

基本上它使用Type元数据来确定它是否是Enum ,然后使用Enum.Parse(...)将它从原始值转换回正确的枚举。 要从Enum转换为string您只需将值转换为string

使用三元运算符可以使它更简洁,但为了清晰起见,我留下了更详细的版本

希望这可以帮助