将 System.Text.Json 源生成器与自定义 JsonConverter 结合使用

zig*_*zag 7 .net c# system.text.json sourcegenerators .net-6.0

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

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

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

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

然而,经过进一步研究,我发现Converters中缺少属性JsonSourceGenerationOptionsAttribute文档中的表格还说明JsonConverterAttribute和在序列化优化模式JsonSerializerOptions.Converters下不受支持。因此,目前看来(.NET 6)不可能将自定义转换器与 json 源生成器混合。

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

Jua*_*dio 5

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

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

var myJsonSerializerContext = new MyJsonSerializerContext(options);
Run Code Online (Sandbox Code Playgroud)

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

因此,您可以为所有类型使用一个 SerializerContext 来初始化并缓存它,以便您可以重用它以避免分配更多内存。