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源生成模式。
根据文档,您可以创建一个 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 来初始化并缓存它,以便您可以重用它以避免分配更多内存。