反序列化 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.asaxJsonFormatters 全局列表中:

// 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',
    ,
);

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

【问题讨论】:

@FᴀʀʜᴀɴAɴᴀᴍ - 不知道你的意思。 我的意思是你回答了你自己的问题?这是某种提示文章吗? @FᴀʀʜᴀɴAɴᴀᴍ - 见***.com/help/self-answer 哦,原来如此,第一次遇到这个东西。 :) @FᴀʀʜᴀɴAɴᴀᴍ - 不用担心! :) 【参考方案1】:

在进行 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'
);

【讨论】:

以上是关于反序列化 Web.API 参数时未调用自定义 Json.NET JsonConverter的主要内容,如果未能解决你的问题,请参考以下文章

在其他反序列化器中调用自定义 Jackson 反序列化器

如何在自定义反序列化器 Spring Boot 中读取路径变量或 URL 参数

如何在 ASP.NET Web API 中为 Json.NET 设置自定义 JsonSerializerSettings?

.net 4.5 Controller:参数polymorphism和自定义Json反序列化

无法反序列化 xml 数组以列出 web api 模型 c#

Spring @RestController 自定义 JSON 反序列化器