我有一些类对我期望的 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>
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);
演示小提琴在这里。