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

End*_*ono 4 c# nancy

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

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

创建自定义类:

public class JsonConvertEnum : JavaScriptPrimitiveConverter
{
    public override IEnumerable<Type> 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在引导期间注册它:

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

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

有更简单的方法吗?

The*_*kie 7

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

public class JsonConvertEnum : JavaScriptPrimitiveConverter
{
    public override IEnumerable<Type> 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上它使用Type元数据来确定它是否是一个Enum,然后利用Enum.Parse(...)它将它从原始值转换回正确的枚举.要转换Enumstring所有你需要做的就是将值转换为astring

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

希望这可以帮助