我有一个包含枚举属性的类,在使用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)构造函数来控制大小写和数字是否仍然被接受。
不确定这是否仍然相关,但我必须直接写一个json文件,我想出了以下拼凑几个stackoverflow的答案在一起
public class LowercaseJsonSerializer
{
private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
ContractResolver = new LowercaseContractResolver()
};
public static void Serialize(TextWriter file, object o)
{
JsonSerializer serializer = new JsonSerializer()
{
ContractResolver = new LowercaseContractResolver(),
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore
};
serializer.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
serializer.Serialize(file, o);
}
public class LowercaseContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
return Char.ToLowerInvariant(propertyName[0]) + propertyName.Substring(1);
}
}
}
它确保我所有的json键小写开始根据json“规则”。将其格式化为干净的缩进格式,并忽略输出中的空值。此外,通过添加一个StringEnumConverter,它打印枚举及其字符串值。
就我个人而言,我发现这是我能想到的最干净的方法,而不必用注释弄脏模型。
用法:
internal void SaveJson(string fileName)
{
// serialize JSON directly to a file
using (StreamWriter file = File.CreateText(@fileName))
{
LowercaseJsonSerializer.Serialize(file, jsonobject);
}
}
我发现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)构造函数来控制大小写和数字是否仍然被接受。