我有一个包含枚举属性的类,在使用JavaScriptSerializer序列化对象时,我的json结果包含枚举的整数值,而不是它的字符串“name”。有没有一种方法来获得枚举作为字符串在我的json而不必创建一个自定义JavaScriptConverter?也许有一个属性,我可以装饰枚举定义,或对象属性?
举个例子:
enum Gender { Male, Female }
class Person
{
int Age { get; set; }
Gender Gender { get; set; }
}
期望的JSON结果:
{ "Age": 35, "Gender": "Male" }
理想情况下,用内置的。net框架类来寻找答案,如果没有可能的替代方案(如Json.net)也是受欢迎的。
我发现Json。NET提供了我正在寻找的StringEnumConverter属性的确切功能:
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }
更多详细信息请参见StringEnumConverter文档。
还有其他地方可以更全局地配置这个转换器:
如果你想让Enum总是被序列化/反序列化为string,则枚举本身:
[JsonConverter typeof (StringEnumConverter)))
enum性别{男,女}
如果有人想避免属性修饰,你可以将转换器添加到你的JsonSerializer(由Bjørn Egil建议):
serializer.Converters。添加(新Newtonsoft.Json.Converters.StringEnumConverter ());
并且它将为它在序列化期间看到的每个枚举工作(由Travis建议)。
或者JsonConverter(由banana建议):
JsonConvert。SerializeObject (MyObject
新的Newtonsoft.Json.Converters.StringEnumConverter ());
此外,你可以通过使用StringEnumConverter(NamingStrategy, Boolean)构造函数来控制大小写和数字是否仍然被接受。
@Iggy回答设置JSON序列化c# enum字符串仅为ASP。NET (Web API等等)。
但是为了使它也适用于特殊的序列化,在开始类中添加以下内容(如Global。asax Application_Start)
//convert Enums to Strings (instead of Integer) globally
JsonConvert.DefaultSettings = (() =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter { CamelCaseText = true });
return settings;
});
更多关于Json的信息。网络页面
此外,要让枚举成员序列化/反序列化特定文本,请使用
System.Runtime.Serialization.EnumMember
属性,像这样:
public enum time_zone_enum
{
[EnumMember(Value = "Europe/London")]
EuropeLondon,
[EnumMember(Value = "US/Alaska")]
USAlaska
}
注意,当存在Description属性时,没有序列化的答案。
下面是支持Description属性的实现。
public class CustomStringEnumConverter : Newtonsoft.Json.Converters.StringEnumConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Type type = value.GetType() as Type;
if (!type.IsEnum) throw new InvalidOperationException("Only type Enum is supported");
foreach (var field in type.GetFields())
{
if (field.Name == value.ToString())
{
var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
writer.WriteValue(attribute != null ? attribute.Description : field.Name);
return;
}
}
throw new ArgumentException("Enum not found");
}
}
枚举:
public enum FooEnum
{
// Will be serialized as "Not Applicable"
[Description("Not Applicable")]
NotApplicable,
// Will be serialized as "Applicable"
Applicable
}
用法:
[JsonConverter(typeof(CustomStringEnumConverter))]
public FooEnum test { get; set; }