自定义JsonConverter不适用于WebAPI对象反序列化

变形虫17

我有一个模型对象,我将其发送到浏览器并发送回给我。我希望对该对象中的ID值进行加密。我创建了一个自定义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。

变形虫17

事实证明代码正常工作。问题是在正在测试的POST上,内容类型未设置为“ application / json”。因此,它没有使用JsonNetFormatter,因此跳过了转换器。

设置contentType后,一切正常!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章