是否可以在 C# 中反序列化 json,以便 json 中的字段实例化具有重写功能的特定子类?

问题描述

假设您有以下 json 部分:

{ "Behavior": "BehaviorTypeA" }

当您反序列化 json 时,反序列化器实质上会将数据从 json 文本导入到类定义中,这可能类似于:

public class MyClass
{
    public string Behavior { get; set; }
}

但是假设您希望该数据指示某种行为,因此您的类定义可能是

public class MyClass
{
    public BaseBehavior Behavior { get; set; }
}

你也有定义

public class BaseBehavior
{
    public abstract void DoIt();
}

public class BehaviorTypeA : BaseBehavior
{
    public override void DoIt()
    {
        // some functionality
    }
}

这是否可以通过 json 反序列化实现,如果可以,那么 json 必须是什么以及如何完成?是否可能需要自定义解串器并可能需要添加反射代码? (BaseBehavior 类不必是抽象类,并且可能包含成员字段。)

解决方法

当然,您始终可以使用自定义逻辑注入自己的 JsonConverter,以使用您想要的功能实例化您想要的类。

我认为您可以使用此库更轻松地完成此操作:How to mount a host directory in a Docker container

假设您使用的是 Newtonsoft.Json,以下是关于完全自定义的 JsonConverters 的一些信息:https://github.com/manuc66/JsonSubTypes

您基本上遵循一种策略模式,其中您想要的每个行为都需要作为自己的类存在,然后您可以根据它们的名称拼凑出任何一组行为。