gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:39:49 26 4
gpt4 key购买 nike

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

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

编辑以澄清:为 MyType 实现自定义转换器, 但 json 包含 MyType 的数组对象。所以,我想创建源生成 JsonSerializerContext反序列化 arrayMyType对象 ( MyType[] ),使用生成的代码反序列化 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 来初始化和缓存它,这样您就可以重用它以避免分配更多内存。

关于c# - 将 System.Text.Json 源生成器与自定义 JsonConverter 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70392787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com