在运行时在 Web API 操作过滤器中获取未知类型

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

我希望能够在不使用反射的情况下更改操作过滤器中的对象结果值。

如果我提供类型(

Person
),我就可以让它正常工作(如下面的代码中提供),但是在运行时我不确定类型是什么,因此我正在寻找更多如果可能的话,“动态”类型。

public class MyFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        var result = context.Result as OkObjectResult;

        string json = JsonConvert.SerializeObject(result.Value);
        json = json.Replace("John", "John Smith");

        var modifiedResultValue = JsonConvert.DeserializeObject<Person>(json);

        result.Value = modifiedResultValue;
    }
}
{
  "name": "John Smith"
}

我尝试过使用动态,如下

var modifiedResultValue = JsonConvert.DeserializeObject<dynamic>(json);

但是它会删除所有值

{
  "Name": []
}

有没有办法实现这个目标?

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

ASP.NET Core 默认使用

System.Text.Json
来处理序列化,而不是 Newtonsoft Json.NET。快速而肮脏的方法是通过安装
Microsoft.AspNetCore.Mvc.NewtonsoftJson
包并向应用程序启动添加
AddNewtonsoftJson
调用来切换到后者。例如:

builder.Services.AddControllers().AddNewtonsoftJson();

另一个选择可能是:

  1. 将过滤器逻辑切换为使用
    System.Text.Json
    (请参阅如何在 System.Text.Json 中使用 JSON 文档对象模型
  2. 对于纯粹的 JSON API,您可以尝试研究自定义序列化器。
© www.soinside.com 2019 - 2024. All rights reserved.