c# – 如何防止Json.NET将枚举转换为字符串?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何防止Json.NET将枚举转换为字符串?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2296字,纯文字阅读大概需要4分钟。
内容图文
![c# – 如何防止Json.NET将枚举转换为字符串?](/upload/InfoBanner/zyjiaocheng/761/9ccd2488273447c49adccbe5a0a90bb3.jpg)
以下课程
public class RequestSections : RequestBase
{
public RequestSections(Command c, Dictionary<SectionIdentifier, BigInteger> v) : base(c)
{
VERSIONS = v;
}
public Dictionary<SectionIdentifier, BigInteger> VERSIONS { get; set; }
}
使用JSON.NET序列化为JSON并生成以下JSON输出:
{
"VERSIONS": {
"Photos": 901,
"Music": 902
},
"CMD": 43
}
问题是SectionIdentifier是枚举,但JSON.NET将它们转换为字符串.
public enum SectionIdentifier
{
Photos = 1000,
Music
}
如何防止JSON.NET将整数枚举值转换为字符串?我想只看到他们的整数表示.
顺便说一下,驻留在RequestBase类中的CMD也是枚举类型,但幸运的是它没有转换为字符串.
解决方法:
JSON spec表示对象中的属性名称(键)必须是字符串.如果你有一个使用枚举值作为键的字典,Json.Net只是在这些值上调用Convert.ToString()来获取JSON属性名. (这可以在source code中的GetPropertyName()方法中看到,该方法由SerializeDictionary()调用.)
可以覆盖此默认行为,以便Json.Net将数字枚举字典键写入JSON(当然,仍然作为字符串,与规范保持一致).这可以使用自定义ContractResolver或自定义JsonConverter来完成.在这种特殊情况下,解析器方法可能会更简单,所以我将在这里展示.以下是您需要的代码:
class CustomResolver : DefaultContractResolver
{
protected override JsonDictionaryContract CreateDictionaryContract(Type objectType)
{
var contract = base.CreateDictionaryContract(objectType);
var keyType = contract.DictionaryKeyType;
if (keyType.BaseType == typeof(Enum))
{
contract.PropertyNameResolver =
propName => ((int)Enum.Parse(keyType, propName)).ToString();
}
return contract;
}
}
要序列化,请通过以下设置将自定义解析程序的实例传递给序列化程序:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
string json = JsonConvert.SerializeObject(foo, settings);
这是一个人为的演示,表明它的工作原理.您可以注释掉设置解析器的行以切换行为.
class Program
{
static void Main(string[] args)
{
var dict = new Dictionary<Color, string>
{
{ Color.Red, "#FF0000" },
{ Color.Green, "#00FF00" },
{ Color.Blue, "#0000FF" },
{ Color.White, "#FFFFFF" }
};
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
settings.Formatting = Formatting.Indented;
string json = JsonConvert.SerializeObject(dict, settings);
Console.WriteLine(json);
}
enum Color { Red = 1, Green = 2, Blue = 3, White = 4 }
}
输出:
{
"1": "#FF0000",
"2": "#00FF00",
"3": "#0000FF",
"4": "#FFFFFF"
}
内容总结
以上是互联网集市为您收集整理的c# – 如何防止Json.NET将枚举转换为字符串?全部内容,希望文章能够帮你解决c# – 如何防止Json.NET将枚举转换为字符串?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。