Newtonsoft.Jsonで直列化からクラスのすべてのインスタンスを除外する
すべてのカスタムタイプは、それをシリアル化する方法を選ぶことができます。
例に、との種類をマーク[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
して、あなたが何かをマークする必要があり[JsonProperty]
そうでないものはシリアライズされません。だから、カスタム型のプロパティは、型が(何も生成しないことがあり、シリアライズされた場合でも{}
シリアル化するために)を:
public class A
{ public string Test { get; set; } = "Test"; public B B { get; set; } = new B(); } [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public class B { public string Foo { get; set; } = "Foo"; }
その後
Console.WriteLine(JsonConvert.SerializeObject(new A()));
生成されます
{ "テスト": "テスト"、 "B":{}}」
このアプローチを使用すると、シリアル化に問題がありますB
まったく。非常に明るいアイデアどちらではありません、あなたは思いませんか?
公式の説明のMemberSerialization列挙型はNewtonsoft.Json.JsonSerializerのメンバーのシリアル化オプションを指定します。
パブリック 列挙MemberSerialization { // // 概要: // すべてのパブリックメンバーがデフォルトで直列化されています。メンバーはNewtonsoft.Json.JsonIgnoreAttribute使用して除外することができます // またはSystem.NonSerializedAttributeを。これがデフォルトのメンバーのシリアル化モードです。 OptOutの= 0 、 // // 概要: // メンバーだけがNewtonsoft.Json.JsonPropertyAttributeまたはSystem.Runtime.Serialization.DataMemberAttributeが付い // シリアライズされます。このメンバーのシリアル化モードもマークすることで設定することができます //のSystem.Runtime.Serialization.DataContractAttributeを持つクラスを。 OptInの=1 、 // // 概要: // すべてのパブリックとプライベートフィールドがシリアライズされます。メンバーはNewtonsoft.Json.JsonIgnoreAttribute使用して除外することができます // またはSystem.NonSerializedAttributeを。このメンバーのシリアル化モードもすることができます 。//をSystem.SerializableAttributeを持つクラスをマークし、IgnoreSerializableAttribute設定することにより、設定 // falseにNewtonsoft.Json.Serialization.DefaultContractResolver上を。 フィールド= 2 }
JSON.Net自己参照ループが検出されました
この修正は、ループの参照を無視し、それらをシリアル化することではありません。この動作はで指定されていますJsonSerializerSettings
。
シングルJsonConvert
過負荷と:
JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), Formatting.Indented, new JsonSerializerSettings() { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore } );
あなたは、このデフォルトの動作を行いたい場合は、追加グローバル設定のコードとをApplication_Start()
Global.asax.csで:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Formatting = Newtonsoft.Json.Formatting.Indented, ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore };