Json.NETをカスタマイズしてプライベートメンバーをシリアル化し、パブリックの読み取り専用プロパティを(属性を使用せずに)シリアル化しない方法を教えてください。Json.NETプライベートメンバーをシリアル化し、読み取り専用のプロパティではない
私はカスタムを作成するときに刺さったIContractResolver
しかし、少し失われています。
Json.NETをカスタマイズしてプライベートメンバーをシリアル化し、パブリックの読み取り専用プロパティを(属性を使用せずに)シリアル化しない方法を教えてください。Json.NETプライベートメンバーをシリアル化し、読み取り専用のプロパティではない
私はカスタムを作成するときに刺さったIContractResolver
しかし、少し失われています。
、DefaultContractResolver.DefaultMembersSearchFlagsをいじりすることは、民間のものを含めることを得ることができますいくつかと、これはCLR例外を発生させるように見えるものの
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);
は、多数のオブジェクトで動作するようです。
Chris' answerに対する応答では、DefaultContractResolver
was deprecated as of version 6のDefaultMemberSearchFlags
プロパティに対応しています。減価償却に関するメッセージにもかかわらず、CreateProperties
メソッドも同様にL.B explainsのように上書きする必要があります。私のために働いた
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);
}
}
:
この方法では、読み取り専用のプロパティを除く含めて、あなたに完全に制御することができます。 +1。除外するプロパティを指定するにはどうしたらいいですか?正規表現オプションはさらに優れています。 – Mukus