保护我的代码免受Newtonsoft JSON的影响。
保护我的代码免受Newtonsoft JSON的影响。
我正在构建一个文本.NET WebAPI Web服务,最简单的情况下它会接收一个GET请求,并返回一个JSON对象数组。
但是,该项目还加载了NewtonsoftJSON nuget包,显然该包重新定义了ApiController
类,使得它的Json()
方法具有不同的声明。最终结果是我得到了以下编译时错误:
我如何保护我的控制器声明免受Newtonsoft的重新定义?
public class ImmediateInformationController : ApiController { public JsonResult Get([FromUri] ImmediateInformation ii) { // 这里有一些代码 return this.Json(iil, JsonRequestBehavior.AllowGet); } }
一些背景:最初我只返回iil
,但在浏览器中测试时,它提示下载ImmediateInformation.json
文件,其中包含我需要的JSON。上述代码是为了将JSON返回为纯文本,并发现当参数类型与MSDN文档不匹配时,Newtonsoft重新定义了ApiController
。
简而言之:这个问题仅仅使用JSON下载问题来说明我正在做的事情。我如何确保当我声明控制器类是ApiController
的子类时,它是Microsoft的API控制器,而不是Newtonsoft的?
问题的原因是在代码中使用了Newtonsoft JSON库,但是没有正确引用该库或者使用了错误的命名空间。解决方法是使用全限定名称或者使用别名来引用Newtonsoft JSON库。
具体来说,解决方法有两种:
1. 使用全限定名称:
在代码中使用完整的命名空间来调用Json方法,例如:
return this.Json(iil, System.Web.Mvc.JsonRequestBehavior.AllowGet);
2. 使用别名:
在代码的开头添加别名引用,例如:
using NJson = Newtonsoft.Json;
然后使用别名来调用Json方法,例如:
return this.Json(iil, NJson.JsonRequestBehavior.AllowGet);
需要注意的是,如果代码中没有直接引用Newtonsoft JSON库,而是通过其他NuGet包间接使用了该库(例如MigraDocs),则不能使用别名来解决问题,只能使用全限定名称。
以上是对问题的原因和解决方法的整理和总结。
问题的原因是Web API 2默认使用了JSON.NET,而教程中可能是针对早期版本或者使用了MVC而不是Web API。解决方法是要么省略JsonRequestBehavior,要么返回正确的返回类型让Web API处理序列化。可以使用以下代码解决:
return this.Json(iil);
或者
public ImmediateInformation Get([FromUri] ImmediateInformation ii) { return ii; }
或者使用IHttpActionResult:
public IHttpActionResult Get([FromUri] ImmediateInformation ii) { return this.Ok(ii); }
根据编辑和评论,实际上您想要解决的问题是如何让IE直接显示application/json而不是下载。当我返回POCO时,浏览器弹出了一个名为