我正在尝试使用 Json.Net 序列化二叉树:
class Node
{
Node Left;
Node Right;
int Data;
}
我想在每个 Node
序列化之前和之后添加自定义代码,所以我尝试使用自定义 JsonConverter
:
class NodeConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Node);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Console.WriteLine("Before");
serializer.serialize(writer, value); // Oops
Console.WriteLine("After");
}
}
但这不起作用,因为 JsonSerializer
将无休止地调用 NodeConverter.WriteJson(..)
方法。
这可以在 Json.NET 中完成吗?
编辑: 这就是我使用自定义转换器的方式:
var root = CreateTree();
using (var ms = new MemoryStream())
using (var writer = new StreamWriter(ms))
{
var serializer = JsonSerializer.Create();
serializer.Converters.Add(new NodeConverter());
serializer.serialize(writer, root);
}
最佳答案
为了打破循环,您可以直接在 WriteJson
方法中序列化属性,例如:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Console.WriteLine("Before");
var n = (Node)value;
writer.WriteStartObject();
SerializeReferencedNode(writer, serializer, "Left", n.Left);
SerializeReferencedNode(writer, serializer, "Right", n.Right);
writer.WritePropertyName("Value");
writer.WriteValue(n.Data);
writer.WriteEndObject();
Console.WriteLine("After");
}
private static void SerializeReferencedNode(JsonWriter writer, JsonSerializer serializer,
string propName, Node node)
{
if (node != null)
{
writer.WritePropertyName(propName);
serializer.Serialize(writer, node);
}
}
这导致一个简单的示例输出如下:
{"Left":{"Value":123},"Right":{"Value":246},"Value":0}
关于c# - Json.NET 中每个树节点序列化前后的自定义代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54766474/