反序列化Web.API参数

时间:2015-12-21 21:02:22

标签: c# jquery ajax asp.net-web-api asp.net-web-api2

我有一个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方法。这就是我在我的JavaScript前端(使用jQuery)调用我的Web.API端点的方式:

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

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

1 个答案:

答案 0 :(得分:1)

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

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