将 System.Text.Json 源代码生成器与自定义 JsonConverter 一起使用

Use System.Text.Json source generator with custom JsonConverter

自定义 JsonConverter<> 类 如何与 System.Text.Json 源代码生成器一起使用?

我想调用 JsonSerializer.Deserialize<MyType[]>(),它不会回退到基于反射的实现并使用自定义 MyTypeJsonParser : JsonConverter<MyType>

编辑以澄清:为 MyType 实现了自定义转换器,但 json 包含一个 MyType 对象数组。因此,我想创建源生成的 JsonSerializerContext 反序列化 MyType 对象(MyType[])的 array,使用生成的代码反序列化 array 部分和手动转换器反序列化 MyType 对象部分。

旧代码 (不使用源代码生成器) 应用自定义转换器,将其添加到 JsonSerializerOptions.Converters

然而,经过进一步研究,我发现 Converters 属性 在 JsonSourceGenerationOptionsAttribute 中丢失了。 documentation 中的表格还指出 JsonConverterAttributeJsonSerializerOptions.Converters 序列化优化模式 不受 支持。因此,目前 (.NET 6) 似乎无法将自定义转换器与 json 源生成器混合使用。

文档不清楚,是否至少元数据收集源码生成方式可以使用JsonConverterAttribute.

根据 documentation 你可以创建一个 JsonSerializerOptions,添加你的转换器并在序列化中使用它。

var options = new JsonSerializerOptions
{
    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
    WriteIndented = false,
};
options.Converters.Add(new MyConverter());

var myJsonSerializerContext = new MyJsonSerializerContext(options);

您不能与多个 SerializerContext 共享您的 JsonSerializerOptions,另一件我在阅读文档时不清楚的事情是您可以为 n 种类型使用一个 SerializerContext。

因此,您可以为所有类型使用一个 SerializerContext 进行初始化和缓存,这样您就可以重用它以避免分配更多内存。