反序列化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到我的的全局列表JsonFormattersGlobal.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',
    },
});

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

内森·朋友

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章