Json.NET序列化私有成员而不是只读属性
如何自定义Json.NET以序列化私有成员而不是序列化公共只读属性(不使用属性)。
我已经开始创建一个自定义的IContractResolver
但有点迷失。
对于部分答案,弄乱DefaultContractResolver.DefaultMembersSearchFlags可以使其包含私有内容:
Newtonsoft.Json.JsonSerializerSettings jss = new Newtonsoft.Json.JsonSerializerSettings(); if (includePrivateMembers) { Newtonsoft.Json.Serialization.DefaultContractResolver dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver(); dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic; jss.ContractResolver = dcr; } return Newtonsoft.Json.JsonConvert.SerializeObject(o, jss);
似乎可以处理很多对象,虽然有些这似乎会产生一个CLRexception。
为了回应Chris的回答 ,自版本6起 , DefaultContractResolver
上的DefaultMemberSearchFlags
属性已被弃用 。 尽管弃用消息说的是,我相信你也需要覆盖CreateProperties
方法,就像LB解释的那样 。
此方法为您提供完全控制,包括排除只读属性:
class PrivateContractResolver : DefaultContractResolver { protected override List GetSerializableMembers(Type objectType) { var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; MemberInfo[] fields = objectType.GetFields(flags); return fields .Concat(objectType.GetProperties(flags).Where(propInfo => propInfo.CanWrite)) .ToList(); } protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) { return base.CreateProperties(type, MemberSerialization.Fields); } }