Я хочу иметь возможность изменять значение результата объекта в фильтре действий без использования отражения.
Я могу заставить это работать нормально (как показано в коде ниже), если я предоставлю тип (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 (откуда JsonConvert). dynamic в этом случае будет трактоваться как JObject из Json.NET, и первый стандартный идентификатор обрабатывает его неправильно.
Быстрый и грязный подход — просто переключиться на последний вариант, установив пакет Microsoft.AspNetCore.Mvc.NewtonsoftJson и добавив вызов AddNewtonsoftJson в автозагрузку приложения. Например:
builder.Services.AddControllers().AddNewtonsoftJson();
Другими вариантами могут быть:
var modifiedResultValue = JsonConvert.DeserializeObject(json, result.Value.GetType());
System.Text.Json (см. Как использовать объектную модель документа JSON в System.Text.Json)Мне просто нужно было получить пакет и добавить AddNewtonsoftJson, как вы предложили. Спасибо не только за ваш ответ, но и за детали, стоящие за ним.
DeserializeObject имеет перегрузку, которая принимает тип newtonsoft.com/json/help/html/… , OkObjectResult имеет DeclaredType: Learn.microsoft.com/en-us/dotnet/api/…, когда это так не ноль, я ожидаю, что в нем будет тип
Person.