添加到 JsonSerializerOptions.Converters 的自定义 JsonConverter 默认不使用

Custom JsonConverter added to JsonSerializerOptions.Converters not used by default

我已经为我的 classes 之一实现了自定义 json 转换器,因为我想使用构造函数进行反序列化。

我已将自定义转换器添加到我的 Startup.cs class:

services.AddControllers()
.AddJsonOptions(opt => 
{
   opt.JsonSerializerOptions.WriteIndented = false;
   opt.JsonSerializerOptions.Converters.Add(new MyJsonConverter());
});

我的自定义 json 转换器如下所示:

public class MyJsonConverter : JsonConverter<MyClass>
{
   ...
}

问题是当运行

var result = await JsonSerializer.DeserializeAsync<RoleEntity[]>(json);

我的自定义 json 转换器没有被触发。

但是,如果像下面这样明确指定它

var serializerOptions = new JsonSerializerOptions
{ 
   Converters = { new MyJsonConverter() }
};
var result = await JsonSerializer.DeserializeAsync<RoleEntity[]>(json, serializerOptions);

有效。

我就是看不出问题出在哪里。我是不是遗漏了一些微不足道的东西?

这是预期的行为。当您直接使用 JsonSerializer.DeserializeAsync 而不指定任何选项时,它不会使用任何自定义选项。您添加的选项适用于 MVC(请参阅 )。您需要在编写时继续使用它,或者将选项注册为单例,然后您可以 resolve/inject 并在 JsonSerializer.DeserializeAsync 调用中使用。

要添加新的单例,您可以使用 IServiceCollection.AddSingleton

有很多方法可以得到你想要的结果(单例选项只是其中之一)但是这个答案的重要部分是你用 .AddJsonOptions 定义的选项不会 用于直接调用 JsonSerializer 方法。