【发布时间】:2021-05-14 13:27:25
【问题描述】:
我有一个从 Microsoft.AspNetCore.Mvc.ControllerBase 派生的 .NET Core 3.1 控制器,结果输出时不会调用自定义 json 转换器。
产品
public interface IProduct { ... }
控制器:
[HttpGet("{id}")]
public IProduct Get(string id)
{
IProduct product = _data.GetProduct(id);
return product;
}
[HttpPut]
public Task Save(IProduct product)
{
return _data.Save(product);
}
JsonConverter:
public class ProductConverter : System.Text.Json.Serialization.JsonConverter<IProduct>
{
public override IProduct Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// this code works from unit tests, trust me :)
}
public override void Write(Utf8JsonWriter writer, IProduct value, JsonSerializerOptions options)
{
// this code works from unit tests, trust me :)
}
}
启动:
services
.AddControllers()
.AddJsonOptions(options => {
options.JsonSerializerOptions.Converters.Add(new ProductConverter());
});
症状
- 当控制器的动作方法
Save被调用时,ProductConverter.Read被调用 - 当控制器的动作方法
Get被调用时,ProductConverter.Write方法不被调用 - 我得到了
IProduct实际执行的json结果
我是否遗漏了什么或做错了什么?
【问题讨论】:
-
您是否在调试器下运行过它?你的断点真的被命中了吗?
-
两种方法都在控制器处中断,在转换器的读取方法中中断,但在写入方法中没有
-
这个答案很旧,但我认为它仍然适用:Why when return interface in a web api method, I get the values of inherited class with interface values?: 当它到达 Json 序列化程序时,它并不关心方法的返回类型是什么。它只知道“我有这个对象,让我们看看我能用它做什么”。 ...
-
没有调用您的转换器,因为返回的实际具体类型不是
IProduct,所以JsonConverter<IProduct>.CanConvert(objectType)返回false。 -
@KirillShilin - 这实际上表明覆盖
CanConvert回答了你的问题。您的问题中没有包含Read()和Write()的实现,但要解决堆栈溢出问题,请参阅How to use default serialization in a custom System.Text.Json JsonConverter?。基本上,克隆options并删除转换器是可行的方法。
标签: c# asp.net-core system.text.json