JSonConverter没有在C#WebAPI中为我的模型的属性触发
| 
 我的WebAPI应用程序中有一个模型,用.NET 4.0编写,具有System.Net.Mime.ContentType类型的属性,如下所示: 
  
  
  [Serializable]
public class FileData
{
    private ContentType contentType;
    private long size;
    private string name;
    public ContentType ContentType
    {
        get { return  contentType; }
        set { contentType = value; } 
    }
    ...
    /* same getter/setter logic for the other fields  */
}该模型位于与我的Web项目不同的程序集中. 所以,客户端发给我一个JSON消息,我需要转换为这个类: {
    "size": 12345,"contentType": "image/png","name": "avatar.png"
}为了告诉Json.NET如何转换ContentType,我已经注册了一个我为此目的编写的自定义JsonConverter: JsonFormatter.SerializerSettings.Converters.Add(new ContentTypeJsonConverter()); 在上面的代码中,我指的是WebApi应用程序的全局JsonFormatter对象. 因此,当客户端向我发送JSON时,我希望控制器能够正确地解析消息. 不幸的是,它失败并出现错误: 
 我知道我可以通过将以下代码添加到我的FileData类来解决这个问题: public class FileData
{
    ...
    [JsonConverter(typeof(ContentTypeJsonConverter))]
    public ContentType ContentType { /* Getter and Setter */ }
}但问题是我不能在FileData类型所在的程序集中向JSON.NET引入依赖项. 有没有办法在不改变FileData类的情况下触发contentType成员的正确反序列化? 除了以上我还尝试了Brian Rogers建议: JsonFormatter.SerializerSettings.ContractResolver = new CustomResolver(); 使用以下CustomResolver实现: class CustomResolver : DefaultContractResolver
{
    protected override JsonContract CreateContract(Type objectType)
    {
        var contract = base.CreateContract(objectType);
        if (objectType == typeof(ContentType))
        {
            contract.Converter = new ContentTypeJsonConverter();
        }
        return contract;
    }
}结果仍然相同. 解决方法
 以下适用于我(Web API 2). 
  
  模型: [Serializable]
public class FileData
{
    private ContentType contentType;
    public ContentType ContentType
    {
        get { return contentType; }
        set { contentType = value; }
    }
}自定义JSON转换器: public class ContentTypeJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(ContentType);
    }
    public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer)
    {
        return new ContentType((string)reader.Value);
    }
    public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer)
    {
        writer.WriteValue(((ContentType)value).ToString());
    }
}转换器注册(WebApiConfig.cs): public static void Register(HttpConfiguration config)
{
    ...
    config
        .Formatters
        .JsonFormatter
        .SerializerSettings
        .Converters
        .Add(new ContentTypeJsonConverter());
}控制器: public class TestController : ApiController
{
    public IHttpActionResult Post(FileData data)
    {
        return this.Ok(data);
    }
}请求: POST /api/test HTTP/1.1
Content-Type: application/json
Host: localhost:48278
Content-Length: 36
{
    "contentType": "image/png"
}响应: HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?ZDpcd29ya1xUb0REXGFwaVx0ZXN0?=
X-Powered-By: ASP.NET
Date: Mon,25 Jul 2016 07:06:02 GMT
Content-Length: 27
{"contentType":"image/png"}(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
