Skip to main content
 首页 » 编程设计

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

2024年02月25日30thcjp

我有一个模型对象,我将其发送到浏览器并返回给我。我希望加密该对象中的 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 字符串。

但是,当我将数据 POST 回我的 Controller 时,我的 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。

请您参考如下方法:

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

设置 contentType 后,一切正常!