這是可能在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
謂語。
public class CustomContractResolver : DefaultContractResolver
{
private readonly Func<bool> _includeProperty;
public CustomContractResolver(Func<bool> includeProperty)
{
_includeProperty = includeProperty;
}
protected override JsonProperty CreateProperty(
MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
var shouldSerialize = property.ShouldSerialize;
property.ShouldSerialize = obj => _includeProperty() &&
(shouldSerialize == null ||
shouldSerialize(obj));
return property;
}
}
以下方法顯示了這兩個自定義類如何一起工作。
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; }
}
你能告訴問題JSON的一些例子嗎? – igofed
你可以創建一個沒有任何子對象的新對象並將其序列化嗎? –
從邏輯上講,這是有道理的,但我想剝離其子對象的任何類型的對象。我認爲json序列化將是實現這一目標的最佳方式,但我絕對樂於接受建議。 –