配置IList类型的字段在反序列化JSON时获取哪个Type

问题描述 投票:0回答:1

我有一些类对我期望的 JSON 文件结构进行建模。对于 JSON 中的列表字段,类中相应的属性具有类型

IList<OtherClass>
。我不控制这些课程。当将 JSON 反序列化为
MyClass
对象时,如何才能使我返回的
IList<T>
类型对象的属性是
ObservableCollection<T>
的属性?请注意
MyClass
具有 IList

类型的深层嵌套属性

希望下面的例子能更清楚地展示我的意图:

class MyClass{
    public IList<NestedClass> MyList { get; set; }
}

class NestedClass{
    public IList<AnotherNestedClass> NestedList { get; set; }
}

class AnotherNestedClass{
    ...
}
var obj = JsonSerializer.Deserialize<MyClass>(jsonString);
Console.WriteLine(obj.GetType()) // This should be ObservableCollection<NestedClass>
c# json .net observablecollection system.text.json
1个回答
0
投票

您可以使用自定义

JsonConverterFactory
自动反序列化任何属性或值 declared as
IList<T>
as
ObservableCollection<T>

首先定义以下转换器工厂:

public class IListAsObservableCollectionConverter : JsonConverterFactory
{
    public override bool CanConvert(Type typeToConvert) => 
        typeToConvert.IsInterface && typeToConvert.IsGenericType && typeToConvert.GetGenericTypeDefinition() == typeof(IList<>);
    
    public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) => 
        (JsonConverter)Activator.CreateInstance(typeof(IListAsObservableCollectionConverterGeneric<>).MakeGenericType(typeToConvert.GetGenericArguments()))!;
    
    class IListAsObservableCollectionConverterGeneric<T> : JsonConverter<IList<T>>
    {
        public override void Write(Utf8JsonWriter writer, IList<T> value, JsonSerializerOptions options) =>
            JsonSerializer.Serialize(writer, value, value.GetType(), options);
        public override IList<T>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
            JsonSerializer.Deserialize<ObservableCollection<T>>(ref reader, options);
    }
}

然后使用以下选项反序列化:

var options = new JsonSerializerOptions
{
    Converters = { new IListAsObservableCollectionConverter() },
    // Other options as required
};
var obj = JsonSerializer.Deserialize<MyClass>(json, options);

演示小提琴在这里

© www.soinside.com 2019 - 2024. All rights reserved.