告诉 Nancy 将枚举序列化为字符串
Tell Nancy to serialize enums into strings
Nancy 在生成 JSON 响应时默认将枚举序列化为整数。我需要将枚举序列化为字符串。
有一种方法可以通过创建 JavaScriptPrimitiveConverter 来自定义 Nancy 的 JSON 序列化。例如,这是我为一个枚举自定义序列化所做的:
创建自定义 class:
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;
}
}
在bootstrap期间注册:
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
可以使用三元运算符使其更简洁,但为了清楚起见,我保留了更冗长的版本
希望对您有所帮助
Nancy 在生成 JSON 响应时默认将枚举序列化为整数。我需要将枚举序列化为字符串。
有一种方法可以通过创建 JavaScriptPrimitiveConverter 来自定义 Nancy 的 JSON 序列化。例如,这是我为一个枚举自定义序列化所做的:
创建自定义 class:
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;
}
}
在bootstrap期间注册:
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
可以使用三元运算符使其更简洁,但为了清楚起见,我保留了更冗长的版本
希望对您有所帮助