使用 Json.Net 作为 MVC 中的默认格式化程序,而不是 API [重复]

Posted

技术标签:

【中文标题】使用 Json.Net 作为 MVC 中的默认格式化程序,而不是 API [重复]【英文标题】:Use Json.Net as default formatter in MVC, Not API [duplicate] 【发布时间】:2014-03-13 00:41:18 【问题描述】:

我刚刚解决了一个最近的问题,其中 Json.Net 允许我在将对象序列化到客户端时包含对象的“类型”。原因是我来回发送的类有一个属性,该属性被键入为 4 个子类的 BaseClass。现在最棒的是,我的客户使用 Json 上的 type 属性正确显示了每一个。

现在我需要将对象发送回我的控制器,而不是 API 控制器。我看过一堆关于使用 Json.Net 作为默认 JsonFormatter 的 api 控制器的帖子,但这不适用于常规 MVC 控制器。

所以我的问题是....我怎样才能让我的控制器默认使用 Json.Net 序列化器?而且...这是否会导致其他可能进行 ajax 调用的项目出现问题?

我能够将我的 json 作为字符串发送回我的控制器,然后使用 JsonConvert 成功反序列化我的对象,所以我知道它可以完成。

感谢任何想法。

编辑: 好的,所以我按照here 的说明更改了 JsonValueProviderFactory,这似乎可以正常工作,但它对原始问题没有帮助。

问题是 JsonFormatter 仍然是旧的,没有使用 Json.Net。所以 ProviderFactory 正在正确地构建字典,但是当它尝试反序列化我的对象时,我只会将我的属性转换为 BaseClass,而不是我期望的派生类。

对此有什么想法?

编辑: 简单...如何在 MVC4 中创建自己的 JsonNetMediaTypeFormatter?我已经更改了 ProviderFactory,但这只会更改每个单独的参数如何序列化为其对应的值。我需要做的是使用 Json.Net,以便将类型为 Hierarchy 的参数序列化为正确的派生类...而不是类型为 Baseclass。

编辑 - 最后: 好的...所以我确实验证了如果我调用 ApiController,它会将传入参数映射到正确的子类。所以,我可以走这条路,但我真的很想找到一种方法,用我的常规控制器获得相同的结果。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,并通过简单地覆盖我的基本控制器类上的 Json 方法来解决它。

前:

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)

    var result = new JsonNetResult
        
            Data = data,
            ContentEncoding = contentEncoding,
            JsonRequestBehavior = behavior
        ;
    return result;

【讨论】:

感谢您的回答,但我确实有两种不同的工作方式。我需要将 JsonFormatter 设置为调用我的 Controller 的默认值,以便它可以反序列化类的层次结构。 看来我误解了原来的问题,我以为你的问题是序列化数据出来,而不是接收回来。将传入数据映射到动作参数的过程是模型绑定,我相信你可以通过这个答案找到足够的信息:***.com/a/13749124/109456希望它有所帮助

以上是关于使用 Json.Net 作为 MVC 中的默认格式化程序,而不是 API [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用JSON.Net(Newtonsoft.Json)作为ASP.Net MVC的json序列化和反序列化工具

使用Json.Net解决MVC中各种json操作

如何使用 JSON.NET 通过 ASP.NET MVC 传递 JSON 日期值? [复制]

如何在 MVC 5 项目中使用 Json.NET 进行 JSON 模型绑定?

使用 Json.Net 处理数据中的换行符

使用 Json.net 将大量数据流式传输为 JSON 格式