Пользовательский JsonConverter не работает при десериализации объекта WebAPI - PullRequest
0 голосов
/ 08 января 2019

У меня есть модельный объект, который я отправляю в браузер и отправляю обратно мне. Я хочу, чтобы это значение идентификатора в этом объекте было зашифровано. Я создал собственный JsonConverter, чтобы зашифровать строку и затем расшифровать ее.

public class SecretItem
{
    [JsonConverter(typeof(EncryptedIdConverter))]
    public string Id { get; set; }
    public string Name { get; set; }
}

Это мой класс EncryptedIdConverter

class EncryptedIdConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        string encryptedValue = (string)value;

        if (!string.IsNullOrWhiteSpace(encryptedValue))
            encryptedValue = Encryption.EncryptString(encryptedValue);

        serializer.Serialize(writer, encryptedValue);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        string decryptedString = (string)reader.Value;

        if (!string.IsNullOrWhiteSpace(decryptedString))
            decryptedString = Encryption.DecryptString(decryptedString);

        return decryptedString;
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(string).IsAssignableFrom(objectType);
    }
}

Если я попытаюсь вызвать функции JsonConvert.Serialization, все будет работать правильно.

JsonConvert.SerializeObject(secretItem)
JsonConvert.DeserializeObject<SecretItem>([JSON secretItem]);

Когда я возвращаю HttpActionResult Ok(secretItem) ... браузер также получает зашифрованную строку Id.

Однако, когда я отправляю данные обратно на мой контроллер, мой метод webapi не получает дешифрованное свойство. Он пропускает JsonConverter.

public async Task<IHttpActionResult> Post(SecretItem secretItem)
{
    // Not decrypted
    var decryptedId = secretItem.Id;
}

Почему логика десериализации не работает так же, как логика сериализации в моем WebAPI? Я даже не знаю, с чего начать отладку.

Мы используем Newtonsoft.Json 10.0.0.0, MVC5, .NET Framework 4.6.1.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Оказывается, код работает правильно. Проблема заключалась в том, что на тестируемом POST тип контента не был установлен на «application / json». Таким образом, он не использовал JsonNetFormatter и поэтому пропустил конвертер.

Как только я установил contentType, все работает!

0 голосов
/ 09 января 2019

Как поживает ваш Global.asax

protected void Application_Start()
{
  AreaRegistration.RegisterAllAreas();
  GlobalConfiguration.Configure(WebApiConfig.Register);
  FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  RouteConfig.RegisterRoutes(RouteTable.Routes);
  BundleConfig.RegisterBundles(BundleTable.Bundles);
}

должно работать

возможно вам нужен TypeConverter

Модель переплета

Когда Web API вызывает метод на контроллере, он должен установить значения для параметров, процесс называется связыванием

  • Это называется Обвязка модели

     Post(SecretItem secretItem)
    
  • Для привязки модели используйте TypeConverter

Сериализация JSON

  • Это называется Сериализация JSON

    HttpActionResult Ok(secretItem)
    
  • Сериализация JSON с использованием JsonConverter

Документация

подробнее

...