Newtonsoft.Json使用
用于记录开发过程中Newtonsoft.Json中使用的常用功能。
枚举类型序列化/反序列化
由于枚举类型的基类是值类型,因此默认情况下(无任何特性修饰)枚举类型序列化之后的值是Int32类型的数字,反序列化会把相应的数字/枚举名称转成对应的枚举。
例如:
类定义
public class User { public int Uid { set; get; } public string Username { set; get; } public string Password { set; get; } public string Phone { set; get; } public bool Enable { set; get; } public SexType Sex { get; set; } } public enum SexType { Man, Women, }
测试代码和运行结果
枚举名称转对象的结果
调整后
public class User { public int Uid { set; get; } public string Username { set; get; } public string Password { set; get; } public string Phone { set; get; } public bool Enable { set; get; } [JsonConverter(typeof(StringEnumConverter))] public SexType Sex { get; set; } }
添加了 [JsonConverter(typeof(StringEnumConverter))] 特性,运行结果
结论
枚举类型没加[JsonConverter(typeof(StringEnumConverter))]特性时:
序列化操作
枚举类型序列化会转换为其对应的Int32的值;
反序列化操作
Int32对应的枚举类型值或枚举类型名称都可以反序列化为对应的枚举类型。
加了[JsonConverter(typeof(StringEnumConverter))]特性后
序列化操作
枚举类型序列化会转换为其对应的枚举类型名称;
反序列化操作
Int32对应的枚举类型值或枚举类型名称都可以反序列化为对应的枚举类型。
序列化后的字符串字段顺序控制
测试类
public class User { public int Uid { set; get; } public string Username { set; get; } public string Password { set; get; } public string Phone { set; get; } public bool Enable { set; get; } [JsonConverter(typeof(StringEnumConverter))] public SexType Sex { get; set; } }
不处理时序列化后的字符串为
{"Uid":1,"Username":"张三","Password":"123456","Phone":"15168351735","Enable":true,"Sex":"Man"}
通过[JsonProperty(Order = 1)]控制字段序列化后的顺序
此方式可以达到预期的目的,前提是我们有序列化对象的源码,还有就是不利于扩展,在修改对象属性时需要重新数里各个属性的排序,因此此处不做过多的介绍。
通过自定义ContractResolver的方式实现
OrderedContractResolver类
public class OrderedContractResolver : DefaultContractResolver { protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { var props = base.CreateProperties(type, memberSerialization); return props.OrderBy(a => a.PropertyName).ToList(); } }
序列化时
var user = new User() { Uid = 1, Username = "张三", Password = "123456", Phone = "15168351735", Enable = true, Sex = SexType.Man }; var json = Newtonsoft.Json.JsonConvert.SerializeObject(user, new JsonSerializerSettings() { ContractResolver = new OrderedContractResolver() });
输出结果
{"Enable":true,"Password":"123456","Phone":"15168351735","Sex":"Man","Uid":1,"Username":"张三"}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)