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

标签 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 添加到我的 Global.asax 中的 JsonFormatters 全局列表中:

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

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

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

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

最佳答案

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

关于c# - 反序列化 Web.API 参数时未调用自定义 Json.NET JsonConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34404269/

相关文章:

jquery - CakePHP 2.1 在激活安全组件的情况下进行 jquery ajax 调用

javascript - 替代 AJAX 异步 : false option for form submit button click event handler

c# - 如何将介于-1.0和+1.0之间的浮点转换为声压的dB(A)?

jquery - 让按钮将背景颜色切换为显示元素的背景颜色

javascript - 首先使用 ajax 加载页面,然后逐渐增加间隔

javascript - 文件上传事件上下文和 javascript

c# - 为什么我的图片框即使显示图像也是空的?

c# - 如何在不调用构造函数的情况下反序列化类?

c# - ClosedXml 中的 "Cannot convert theme color to Color"

javascript - 在传播过程中修改事件数据