gpt4 book ai didi

c# - JSonConverter 没有在 C# WebAPI 中触发我的模型的属性

转载 作者:行者123 更新时间:2023-11-30 12:41:10 24 4
gpt4 key购买 nike

我的 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 时,我希望 Controller 能够正确解析消息。

不幸的是,它因错误而失败:

"Could not cast or convert from System.String to System.Net.Mime.ContentType."

我知道我可以通过将以下代码添加到我的 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());
}

Controller :

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"}

关于c# - JSonConverter 没有在 C# WebAPI 中触发我的模型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38553175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com