c# – 如何在不添加[JsonProperty]属性的情况下序列化JSON.NET中
发布时间:2020-12-15 08:31:51 所属栏目:百科 来源:网络整理
导读:是否可以使用 JSON.NET序列化静态属性,而无需为每个属性添加[JsonProperty]属性. 示例类: public class Settings { public static int IntSetting { get; set; } public static string StrSetting { get; set; } static Settings() { IntSetting = 5; StrSe
是否可以使用
JSON.NET序列化静态属性,而无需为每个属性添加[JsonProperty]属性.
示例类: public class Settings { public static int IntSetting { get; set; } public static string StrSetting { get; set; } static Settings() { IntSetting = 5; StrSetting = "Test str"; } } 预期结果: { "IntSetting": 5,"StrSetting": "Test str" } 默认行为会跳过静态属性: var x = JsonConvert.SerializeObject(new Settings(),Formatting.Indented); 解决方法
您可以使用自定义合约解析程序执行此操作.具体来说,您需要子类DefaultContractResolver并覆盖GetSerializableMembers函数:
public class StaticPropertyContractResolver : DefaultContractResolver { protected override List<MemberInfo> GetSerializableMembers(Type objectType) { var baseMembers = base.GetSerializableMembers(objectType); PropertyInfo[] staticMembers = objectType.GetProperties(BindingFlags.Static | BindingFlags.Public); baseMembers.AddRange(staticMembers); return baseMembers; } } 这里我们所做的就是调用GetSerializableMembers的基本实现,然后将公共静态属性添加到要序列化的成员列表中. 要使用它,您可以创建一个新的JsonSerializerSettings对象,并将ContractResolver设置为StaticPropertyContractResolver的一个实例: var serializerSettings = new JsonSerializerSettings(); serializerSettings.ContractResolver = new StaticPropertyContractResolver(); 现在,将这些设置传递给JsonConvert.SerializeObject,一切都应该工作: string json = JsonConvert.SerializeObject(new Settings(),serializerSettings); 输出: { "IntSetting": 5,"StrSetting": "Test str" } 示例:https://dotnetfiddle.net/pswTJW (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |