告诉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
使用三元运算符可以使它更简洁,但为了清晰起见,我留下了更详细的版本
希望这可以帮助