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); } }