1

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

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

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

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

但是,经过进一步研究,我发现Converters. 文档JsonSourceGenerationOptionsAttribute中的表格还指出,并且在序列化优化模式不受支持。因此,目前(.NET 6)似乎不可能将自定义转换器与 json 源生成器混合。JsonConverterAttributeJsonSerializerOptions.Converters

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

4

1 回答 1

1

根据文档,您可以创建一个 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 并将其缓存,以便您可以重用它以避免分配更多内存。

于 2022-01-21T15:26:16.660 回答