【发布时间】:2016-06-26 10:08:44
【问题描述】:
我添加了一个 TypeFormatter,以便使用 JSON.NET 作为 Web api 操作的主要序列化器/反序列化器。
鉴于这个简单的动作
[HttpPost]
[Route("api/myentity/")]
public async Task<HttpResponseMessage> CreateMyEntity(MyEntity entity)
{
// .. stuff to add
// return 200, with some additional info
return ResultOk(new {status = "Yay, added"});
}
然后是 JSON.net 类型格式化程序(也添加到配置中)
public JsonSerializer Serializer { get; private set; }
/// <summary>
/// Specify the media types that this MediaTypeFormatter handles
/// </summary>
public JsonNetMediaTypeFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json") { CharSet = "utf-8" });
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/json") { CharSet = "utf-8" });
Serializer = new JsonSerializer
{
TypeNameHandling = TypeNameHandling.Objects,
NullValueHandling = NullValueHandling.Ignore
};
}
public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
{
return readStream.ReadAsJson(type, Serializer);
}
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, System.Net.TransportContext transportContext)
{
return writeStream.WriteAsJson(value, Serializer);
}
使用以下模型调用api操作时:
application/json
{
"Name":"ACME",
"Phone":"0123456"
}
(内容没有区别)
我收到了Unexpected token while deserializing object: EndObject. Path '', line 4, position 2.
在其他请求中,有趣的是 JSON.net 总是在 JSON 的最后一个字符之后报告行和字符(在本例中为第 4 行 == "}")
我在序列化程序配置中缺少什么?
谢谢
【问题讨论】:
-
默认使用 JSON.net。您不需要为此定义自定义媒体类型格式化程序。 source
-
你知道如何更改底层 JSON.NEt 序列化器的
NullValueHandling吗? -
是的,在下面的答案中添加了一个示例
标签: c# asp.net asp.net-mvc asp.net-web-api json.net