Получение неизвестного типа во время выполнения в фильтре действий веб-API

Я хочу иметь возможность изменять значение результата объекта в фильтре действий без использования отражения.

Я могу заставить это работать нормально (как показано в коде ниже), если я предоставлю тип (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": []
}

Есть ли способ добиться этого?

DeserializeObject имеет перегрузку, которая принимает тип newtonsoft.com/json/help/html/… , OkObjectResult имеет DeclaredType: Learn.microsoft.com/en-us/dotnet/api/…, когда это так не ноль, я ожидаю, что в нем будет тип Person.

rene 18.05.2024 10:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ASP.NET Core по умолчанию использует System.Text.Json для обработки сериализации, а не Newtonsoft Json.NET (откуда JsonConvert). dynamic в этом случае будет трактоваться как JObject из Json.NET, и первый стандартный идентификатор обрабатывает его неправильно.

Быстрый и грязный подход — просто переключиться на последний вариант, установив пакет Microsoft.AspNetCore.Mvc.NewtonsoftJson и добавив вызов AddNewtonsoftJson в автозагрузку приложения. Например:

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

Другими вариантами могут быть:

  1. Предоставьте информацию о типе Json.NET, чтобы он использовал правильный:
    var modifiedResultValue = JsonConvert.DeserializeObject(json, result.Value.GetType());
    
  2. Переключите логику фильтра на использование System.Text.Json (см. Как использовать объектную модель документа JSON в System.Text.Json)
  3. Для API-интерфейсов JSON вы можете попробовать изучить собственные сериализаторы.

Мне просто нужно было получить пакет и добавить AddNewtonsoftJson, как вы предложили. Спасибо не только за ваш ответ, но и за детали, стоящие за ним.

MVCKarl 18.05.2024 11:10

Другие вопросы по теме