TL;DR 我已经为 ASP.NET Core 应用程序中的类型设置了 JsonConverter,虽然在接收数据时正确调用了
方法,但在写入数据时不会调用Read
方法。Write
我为我开发的自定义类型创建了一个
JsonConverter
(枚举模式实现):
class MyEnum
{
private MyEnum(int code, string description)
{
Code = code;
Description = description;
}
public int Code { get; private set; }
public string Description { get; private set; }
public static MyEnum First = new(1, "First");
public static MyEnum Second = new(2, "Second");
public static Parse(string description) => description switch
{
"First" => MyEnum.First,
"Second" => MyEnum.Second,
}
public override string ToString() => Description;
}
转换器很简单,类似于下面的代码:
public class MyEnumConverter : JsonConverter<MyEnum>
{
public override T? Read(ref Utf8JsonReader reader, Type _, JsonSerializerOptions _) => MyEnum.Parse(reader.GetString());
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions _)
=> writer.WriteStringValue(value.ToString());
}
并配置 ASP.NET Core 以使用此转换器:
builder.Services
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(
new MyEnumConverter());
});
令人惊讶的是,当测试返回该类型的控制器时,我得到一个整个类序列化的 Json,类似于:
{ "code": 1, "description": "First" }
但是,当接收请求时,
Read
方法被正确调用!
顺便说一句,这是控制器方法签名:
public class Dto { public MyEnum Foo { get; set; } }
public async Task<Results<CreatedAtRoute<Dto>, BadRequest<string>>> Create(
[FromBody] Dto dto);
知道为什么会发生这种情况吗?
由于您使用的是 HttpResults 设置,因此您已对
Microsoft.AspNetCore.Http.Json.JsonOptions
类型应用任何配置;在这里添加该转换器。
builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(
o => o.SerializerOptions.Converters.Add(new MyEnumConverter())
);