在反序列化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发送请求时,永远不会调用CanConvert
和ReadJson
方法。 这就是我在我的JavaScript前端(使用jQuery)调用我的Web.API端点的方法:
$.ajax({ type: 'POST', url: 'api/person', data: { FirstName: 'First', LastName: 'Last', Age: 110, UserName: 'UserName', }, });
为什么我的自定义JsonConverter
被JsonConverter
忽略了?
在进行jQuery .ajax()
调用时,需要将数据作为JSON发送,否则Web.API在反序列化数据时不会调用任何与JSON相关的转换器。 尝试添加JSON contentType
和JSON.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' });