JsonConverter<T>.Write 不被调用

问题描述 投票:0回答:1

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);

知道为什么会发生这种情况吗?

c# asp.net-core
1个回答
0
投票

由于您使用的是 HttpResults 设置,因此您已对

Microsoft.AspNetCore.Http.Json.JsonOptions
类型应用任何配置;在这里添加该转换器。

builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(
    o => o.SerializerOptions.Converters.Add(new MyEnumConverter())
);
© www.soinside.com 2019 - 2024. All rights reserved.