自定义JsonConverter无法进行WebAPI对象反序列化



我有一个模型对象,我将其发送到浏览器并返回给我。我希望对该对象中的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回我的控制器时,我的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,一切都正常!

您的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

文档

  • ASP.NET Web API中的参数绑定| Microsoft Docs

  • ASP.NET Web API中的JSON和XML序列化| Microsoft Docs

更多

  • asp.net mvc-C#WebAPI:将默认JSON序列化程序设置为NewtonSoft JSON-堆栈溢出

  • c#-在ASP.NET MVC中设置默认的JSON序列化程序-堆栈溢出

  • c#-如何在MVC5项目中使用Json.NET进行Json模型绑定?-堆栈溢出

相关内容

  • 没有找到相关文章

最新更新