我刚解决了最近的一个问题,即Json.Net允许我在将其序列化到客户端时包含对象的“类型”。这样做的原因是我来回发送的类具有一个类型为4个子类的BaseClass的属性。现在最棒的是我的客户端使用Json上的type属性正确显示每个客户端。
现在我需要将对象发送回Controller,而不是API控制器。我已经看过很多关于使用Json.Net作为默认JsonFormatter的api控制器的帖子,但是这不适用于常规MVC控制器。
所以我的问题是......如何让我的Controller默认使用Json.Net Serializer?并且......这会导致其他可能进行ajax调用的项目出现问题吗?
我能够将json作为字符串发送回控制器,然后使用JsonConvert成功反序列化我的对象,所以我知道可以完成。
任何想法都表示赞赏。
修改: 好的,所以我按照here的说明更改了JsonValueProviderFactory,这似乎有效,但它没有帮助原始问题。
问题是JsonFormatter仍然是旧的,而不是使用Json.Net。所以ProviderFactory正在构建字典,但是当它试图反序列化我的对象时,我只是将我的属性转换为BaseClass,而不是我期望的派生类。
关于那部分的想法?
修改: 简单地说......如何在MVC4中创建自己的JsonNetMediaTypeFormatter?我已经更改了ProviderFactory,但这只会更改每个参数序列化为相应值的方式。我需要做的是使用Json.Net,以便将我作为层次结构输入的参数序列化为正确的派生类...而不是作为基类输入。
修改 - 上一次: 好的...所以我确实验证了如果我调用ApiController,它会将传入的参数映射到正确的子类。所以,我可以走这条路,但我真的想找到一种方法与我的常规控制器获得相同的结果。
答案 0 :(得分:0)
我有同样的问题并通过简单地覆盖我的基本控制器类上的Json方法来解决它。
EX:
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;
}