【问题标题】:Custom JsonConverter for Abstract Class - C#抽象类的自定义 JsonConverter - C#
【发布时间】:2023-02-02 18:36:58
【问题描述】:

这是一个列表,它的类型是一个抽象类:

List<AbstractClass> mainList

在此列表中,我将保存从AbstractClass 继承的不同类型。

mainList.Add(InheritedClassA);
mainList.Add(InheritedClassB);

现在我已经为它写了一个 Custom JsonConverter:

public class CustomConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<AbstractClass>);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var obj = reader.Value as List<AbstractClass>;
        return serializer.Deserialize(reader, typeof(List<AbstractClass>));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var list = value as List<AbstractClass>;
        if (list.Count > 0)
        {
            if ((value as List<AbstractClass>)[0] is InheritedClassA)
            {
                List<InheritedClassA> raw = new List<InheritedClassA>();

                foreach (var o in list)
                    raw.Add(o as InheritedClassA);

                serializer.Serialize(writer, raw);
            }

            if ((value as List<AbstractClass>)[0] is InheritedClassB)
            {
                List<StandardRequestObject> standard = new List<InheritedClassB>();

                foreach (var o in list)
                    standard.Add(o as InheritedClassB);

                serializer.Serialize(writer, standard);
            }
        }
    }
}

Write 方法会工作得很好,它会正确保存数据,但 Read 方法不能。读者的价值是空的!我的意思是在任何转换之前它是空的。什么都没有!

哪里有问题?我该如何解决?

【问题讨论】:

  • 您的意思是“reader.value”值为 null 而不是“reader”值?转换后因为它不是 List<AbstractClass> 但可能是来自 json 的字符串?是什么告诉调试器“reader.value”的类型?
  • List&lt;Z&gt; 不是 List&lt;X&gt;,即使 Z 派生自 X 也永远不会。有两种不同的类型,as运算符将返回null
  • 也读取将无法工作,因为反序列化器无法猜测没有类型鉴别器的类型(为什么它有 +1?我们不知道什么 json 被反序列化以及没有 MVCE 的类型......非常奇怪的投票模式和主持人应该采取看)
  • @Selvin 我想我问了一个合理的问题。它与反序列化有关。如果您不知道答案,并不意味着这是一个糟糕的问题。

标签: c# json json.net


【解决方案1】:

也许你可以让你的转换器成为一个通用类

public class CustomConverter<T> : JsonConverter where T : AbstractClass
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var obj = reader.Value as List<T>;
        return serializer.Deserialize(reader, typeof(List<T>));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多