定制Json.NET JsonConverter不被称为反序列化Web.API参数

问题描述:

我有一个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; } } 
} 

我已经添加了这个JsonConverter到我的全球的JsonFormatters名单在我Global.asax

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

当我发送给我的Web.API的要求,CanConvertReadJson方法不会被调用。这是我如何打电话给我Web.API终点前我的JavaScript前端(使用jQuery):

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

为什么我的自定义JsonConverter被忽略Web.API?

+0

@FᴀʀʜᴀɴAɴᴀᴍ - 不知道你的意思。 –

+0

我的意思是你回答了你自己的问题?这是一些尖端文章? –

+0

@FᴀʀʜᴀɴAɴᴀᴍ - 见http://stackoverflow.com/help/self-answer –

当您调用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' 
});