在反序列化Web.API参数时未调用自定义Json.NET JsonConverter

我有一个Web.API端点,它将这样的对象作为参数:

public class Person { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } public UserName UserName { get; set; } } 

例如:

 [Route("api/person")] [AcceptVerbs("POST")] public void UpdatePerson(Person person) { // etc. } 

我已经定义了一个自定义JsonConverter来从JSON字符串属性转换为我的自定义UserName类:

 public class UserNameJsonDeserializer : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(UserName); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return new UserName((string)reader.Value); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanRead { get { return true; } } public override bool CanWrite { get { return false; } } } 

我在我的Global.asax JsonFormatters这个JsonConverter添加到我的全局JsonFormatters列表中:

 // Automatically dsserialize JSON strings to UserNames GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new UserNameJsonDeserializer()); 

当我向Web.API发送请求时,永远不会调用CanConvertReadJson方法。 这就是我在我的JavaScript前端(使用jQuery)调用我的Web.API端点的方法:

 $.ajax({ type: 'POST', url: 'api/person', data: { FirstName: 'First', LastName: 'Last', Age: 110, UserName: 'UserName', }, }); 

为什么我的自定义JsonConverterJsonConverter忽略了?

在进行jQuery .ajax()调用时,需要将数据作为JSON发送,否则Web.API在反序列化数据时不会调用任何与JSON相关的转换器。 尝试添加JSON contentTypeJSON.stringify -ing您的data参数:

 $.ajax({ type: 'POST', url: 'api/person', data: JSON.stringify({ FirstName: 'First', LastName: 'Last', Age: 110, UserName: 'UserName' }), contentType: 'application/json; charset=utf-8' });