反序列化 Web.API 参数时未调用自定义 Json.NET JsonConverter
Posted
技术标签:
【中文标题】反序列化 Web.API 参数时未调用自定义 Json.NET JsonConverter【英文标题】:Custom Json.NET JsonConverter is not being called while deserializing Web.API parameter 【发布时间】:2016-03-28 00:49:40 【问题描述】:我有一个 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 前端(使用 jQuery)前面调用 Web.API 端点的方式:
$.ajax(
type: 'POST',
url: 'api/person',
data:
FirstName: 'First',
LastName: 'Last',
Age: 110,
UserName: 'UserName',
,
);
为什么我的自定义 JsonConverter
会被 Web.API 忽略?
【问题讨论】:
@FᴀʀʜᴀɴAɴᴀᴍ - 不知道你的意思。 我的意思是你回答了你自己的问题?这是某种提示文章吗? @FᴀʀʜᴀɴAɴᴀᴍ - 见***.com/help/self-answer 哦,原来如此,第一次遇到这个东西。 :) @FᴀʀʜᴀɴAɴᴀᴍ - 不用担心! :) 【参考方案1】:在进行 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'
);
【讨论】:
以上是关于反序列化 Web.API 参数时未调用自定义 Json.NET JsonConverter的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义反序列化器 Spring Boot 中读取路径变量或 URL 参数
如何在 ASP.NET Web API 中为 Json.NET 设置自定义 JsonSerializerSettings?
.net 4.5 Controller:参数polymorphism和自定义Json反序列化