Json.NET 序列化私有成员而不是只读属性

本文关键字:只读属性 成员 NET 序列化 Json | 更新日期: 2023-09-27 18:31:18

如何自定义 Json.NET 以序列化私有成员而不序列化公共只读属性(不使用属性)。

我在创建自定义IContractResolver方面遇到了一些尝试,但有点迷茫。

Json.NET 序列化私有成员而不是只读属性

对于部分答案,弄乱 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);
似乎

适用于许多对象,尽管对于某些对象,这似乎会产生CLR异常。

为了回应 Chris 的回答,DefaultContractResolver 上的 DefaultMemberSearchFlags 属性从版本 6 开始被弃用。不管弃用消息说了什么,我相信你也需要覆盖CreateProperties方法,就像 L.B 解释的那样。

此方法为您提供完全控制,包括排除只读属性:

class PrivateContractResolver : DefaultContractResolver
{
    protected override List<MemberInfo> 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<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
           return base.CreateProperties(type, MemberSerialization.Fields);
    }           
}