C# 用于Web API的JSON.NET Serialiser(mvc5)

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

我添加了一个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"});
 }
(内容没有区别)

我在反序列化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
吗?是的,在下面的回答中添加了一个示例