c# - Json.NET 中每个树节点序列化前后的自定义代码

标签 c# json.net

我正在尝试使用 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/

相关文章:

c# - 如何创建像 List<String,Object> 这样的集合?

c# - 如何修复 json.net (Newtonsoft.Json) 运行时文件加载异常

c# - 如何使用 Linq 将列表集合获取到列表?

c# - 在持久化聚合之前发布领域事件是否安全?

c# - 异步任务超时

c# - 带有资源文件的居中 DataGridTextColumn 标题中的换行符

c# - 如何创建 JSON.NET 日期到字符串自定义转换器

c# - 序列化时如何伪造 JSON.NET 中的类型?

c# - 序列化和反序列化索引字段名称以列出

C# WinForms 用户/权限管理