【问题标题】:Tell Nancy to serialize enums into strings告诉 Nancy 将枚举序列化为字符串
【发布时间】:2016-05-13 15:16:19
【问题描述】:

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;
    }
}

在引导过程中注册它:

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

我需要为我的所有枚举执行此操作。

有没有更简单的方法?

【问题讨论】:

    标签: c# nancy


    【解决方案1】:

    我没有时间自己测试,但是下面的代码应该适用于所有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();
        }
    }
    

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

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

    希望对你有帮助

    【讨论】:

    • 看起来很有前途,我会尽快尝试 :) 确实是超级骗人的快乐之路!
    • 成功了!我使用了三进制,所以它变成了一行:return obj.GetType().IsEnum ? obj.ToString() : null;.
    • 很高兴我能帮上忙 =)
    猜你喜欢
    • 2012-02-27
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多