我有一个 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 发送请求时,永远不会调用 CanConvert
和 ReadJson
方法。这就是我调用 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 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'
});
关于c# - 反序列化 Web.API 参数时未调用自定义 Json.NET JsonConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34404269/