これは、可能な限りJson.NETで、JsonWriter
とシリアライザのContractResolver
との間の調整を使用してください。
カスタムJsonWriter
は、オブジェクトが開始されたときにカウンタをインクリメントし、終了すると再びデクリメントします。
public class CustomJsonTextWriter : JsonTextWriter
{
public CustomJsonTextWriter(TextWriter textWriter) : base(textWriter) {}
public int CurrentDepth { get; private set; }
public override void WriteStartObject()
{
CurrentDepth++;
base.WriteStartObject();
}
public override void WriteEndObject()
{
CurrentDepth--;
base.WriteEndObject();
}
}
カスタムContractResolver
は、現在の深さを確認するために使用されるすべてのプロパティに特別なShouldSerialize
述語を適用します。
次の方法は、これら2つのカスタムクラスがどのように連携して動作するかを示しています。
public static string SerializeObject(object obj, int maxDepth)
{
using (var strWriter = new StringWriter())
{
using (var jsonWriter = new CustomJsonTextWriter(strWriter))
{
Func<bool> include =() => jsonWriter.CurrentDepth <= maxDepth;
var resolver = new CustomContractResolver(include);
var serializer = new JsonSerializer {ContractResolver = resolver};
serializer.Serialize(jsonWriter, obj);
}
return strWriter.ToString();
}
}
次のテストコードでは、最大深度をそれぞれ1と2レベルに制限しています。
var obj = new Node {
Name = "one",
Child = new Node {
Name = "two",
Child = new Node {
Name = "three"
}
}
};
var txt1 = SerializeObject(obj, 1);
var txt2 = SerializeObject(obj, 2);
public class Node
{
public string Name { get; set; }
public Node Child { get; set; }
}
でこれを使用することができますか? – igofed
子なしで新しいオブジェクトを作成してそれをシリアル化できますか? –
論理的には意味がありますが、私はObject型のオブジェクトをその子要素から取り除きたいと思っています。私はjsonのシリアライゼーションがこれを行う最善の方法だと思っていましたが、私は間違いなく提案についています。 –