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

标签 c# nancy

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

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

创建自定义类:

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

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

有没有更简单的方法?

最佳答案

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

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

希望对你有帮助

关于c# - 告诉 Nancy 将枚举序列化为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35193759/

相关文章:

c# - 如何在 Simple.Data 中正确执行预加载?

c# - 南希FX : how to get posted form value?

c# - 带有 Mono 的 ubuntu 上的 Nancy selfhosting 错误

c# - 基于OOP概念的C和C#有什么区别?

C#:删除两个定界符之间的所有字符

azure - 为什么 WAIISHost 会锁定某些文件

c# - Nancy Razor 部分 View 不在 Release模式下呈现

c# - 是否支持像 ASP.NET MVC 这样的 NancyFx 反向路由?

c# - 我可以模拟 SqlConnection.BeginTransaction c# 吗?

c# - 运行一个程序实例