C# 用于Web API的JSON.NET Serialiser(mvc5)
我添加了一个TypeFormatter,以便使用JSON.NET作为web api操作的主要序列化器/反序列化器 考虑到这个简单的动作C# 用于Web API的JSON.NET Serialiser(mvc5),c#,asp.net,asp.net-mvc,asp.net-web-api,json.net,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,Json.net,我添加了一个TypeFormatter,以便使用JSON.NET作为web api操作的主要序列化器/反序列化器 考虑到这个简单的动作 [HttpPost] [Route("api/myentity/")] public async Task<HttpResponseMessage> CreateMyEntity(MyEntity entity) { // .. stuff to add // return 200, with some additiona
[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"});
}
(内容没有区别)
我在反序列化object:EndObject时得到一个意外标记。路径“”,第4行,位置2。
在其他请求中,有趣的是JSON.net总是在JSON的最后一个字符后报告行和字符(在本例中,第4行==“}”)
serialiser配置中缺少什么
谢谢我不是问你为什么要实现自己的媒体类型格式化程序,我想你有自己的理由。您能告诉我从哪里获得ReadAsJson扩展方法吗 我发现了这个实现,我认为obj.GetType().IsSubclassOf(instanceType)有一个小错误。这个表达式永远不会为真,第二次尝试反序列化使用的流将被消耗到最后 我做了一个小测试,和你们面临的一样例外
class Foo
{
public string Test { get; set; }
}
public static Stream ToStream(string str)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(str);
writer.Flush();
stream.Position = 0;
return stream;
}
static void Main(string[] args)
{
var stream = Program.ToStream(@"{ ""Test"" : ""TesT"" }");
using (var reader = new JsonTextReader(new StreamReader(stream)))
{
var serializer = new JsonSerializer
{
TypeNameHandling = TypeNameHandling.Objects,
NullValueHandling = NullValueHandling.Ignore
};
var obj = serializer.Deserialize(reader);
// We want to try deserialization without specifying an explicit type first,
// then see if the resulting type is compatible with the type that is expected
// from the Web API stack stream.
// If not, then we try to read it again using an explicit type
// (although it probably won't work anyway still :p)
var test = obj.GetType().IsSubclassOf(typeof(Foo)) ? obj : serializer.Deserialize(reader, typeof(Foo));
}
所以,解决方案是实现您自己的反序列化方法,您可以使用我的示例作为开始,简单地将预期类型添加到反序列化方法中,当然还可以删除最终测试
var obj = serializer.Deserialize(reader, TYPE);
我不是问你为什么要实现自己的媒体类型格式化程序,我想你有自己的理由。您能告诉我从哪里获得ReadAsJson扩展方法吗 我发现了这个实现,我认为obj.GetType().IsSubclassOf(instanceType)有一个小错误。这个表达式永远不会为真,第二次尝试反序列化使用的流将被消耗到最后 我做了一个小测试,和你们面临的一样例外
class Foo
{
public string Test { get; set; }
}
public static Stream ToStream(string str)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(str);
writer.Flush();
stream.Position = 0;
return stream;
}
static void Main(string[] args)
{
var stream = Program.ToStream(@"{ ""Test"" : ""TesT"" }");
using (var reader = new JsonTextReader(new StreamReader(stream)))
{
var serializer = new JsonSerializer
{
TypeNameHandling = TypeNameHandling.Objects,
NullValueHandling = NullValueHandling.Ignore
};
var obj = serializer.Deserialize(reader);
// We want to try deserialization without specifying an explicit type first,
// then see if the resulting type is compatible with the type that is expected
// from the Web API stack stream.
// If not, then we try to read it again using an explicit type
// (although it probably won't work anyway still :p)
var test = obj.GetType().IsSubclassOf(typeof(Foo)) ? obj : serializer.Deserialize(reader, typeof(Foo));
}
所以,解决方案是实现您自己的反序列化方法,您可以使用我的示例作为开始,简单地将预期类型添加到反序列化方法中,当然还可以删除最终测试
var obj = serializer.Deserialize(reader, TYPE);
默认情况下,在Web Api中使用JSON.net<代码>NullValueHandling可以在
序列化设置中配置:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
}
默认情况下,在Web Api中使用JSON.net<代码>NullValueHandling
可以在序列化设置中配置:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
}
默认情况下使用JSON.net。您不需要为此定义自定义媒体类型格式化程序。您知道如何更改底层JSON.NEt serialiser的NullValueHandling
吗?是的,在下面的回答中添加了一个示例默认使用JSON.NEt。您不需要为此定义自定义媒体类型格式化程序。您知道如何更改底层JSON.NEt serialiser的NullValueHandling
吗?是的,在下面的回答中添加了一个示例