我希望能够在不使用反射的情况下更改操作过滤器中的对象结果值。
如果我提供类型(
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": []
}
有没有办法实现这个目标?
ASP.NET Core 默认使用
System.Text.Json
来处理序列化,而不是 Newtonsoft Json.NET。快速而肮脏的方法是通过安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson
包并向应用程序启动添加 AddNewtonsoftJson
调用来切换到后者。例如:
builder.Services.AddControllers().AddNewtonsoftJson();
另一个选择可能是:
System.Text.Json
(请参阅如何在 System.Text.Json 中使用 JSON 文档对象模型)