添加到 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
方法。
我已经为我的 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(请参阅 JsonSerializer.DeserializeAsync
调用中使用。
要添加新的单例,您可以使用 IServiceCollection.AddSingleton
。
有很多方法可以得到你想要的结果(单例选项只是其中之一)但是这个答案的重要部分是你用 .AddJsonOptions
定义的选项不会 用于直接调用 JsonSerializer
方法。