将 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 中的表格还指出 JsonConverterAttribute
和 JsonSerializerOptions.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 进行初始化和缓存,这样您就可以重用它以避免分配更多内存。
自定义 JsonConverter<>
类 如何与 System.Text.Json
源代码生成器一起使用?
我想调用 JsonSerializer.Deserialize<MyType[]>()
,它不会回退到基于反射的实现并使用自定义 MyTypeJsonParser : JsonConverter<MyType>
。
编辑以澄清:为 MyType
实现了自定义转换器,但 json 包含一个 MyType
对象数组。因此,我想创建源生成的 JsonSerializerContext
反序列化 MyType
对象(MyType[]
)的 array
,使用生成的代码反序列化 array
部分和手动转换器反序列化 MyType
对象部分。
旧代码 (不使用源代码生成器) 应用自定义转换器,将其添加到 JsonSerializerOptions.Converters
。
然而,经过进一步研究,我发现 Converters
属性 在 JsonSourceGenerationOptionsAttribute
中丢失了。 documentation 中的表格还指出 JsonConverterAttribute
和 JsonSerializerOptions.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 进行初始化和缓存,这样您就可以重用它以避免分配更多内存。