JSONは、クラスレベルで無視します

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

参考:https://github.com/JamesNK/Newtonsoft.Json/issues/78

 

おすすめ

転載: www.cnblogs.com/chucklu/p/11076585.html
おすすめ