保护我的代码免受Newtonsoft JSON的影响。

17 浏览
0 Comments

保护我的代码免受Newtonsoft JSON的影响。

我正在构建一个文本.NET WebAPI Web服务,最简单的情况下它会接收一个GET请求,并返回一个JSON对象数组。

但是,该项目还加载了NewtonsoftJSON nuget包,显然该包重新定义了ApiController类,使得它的Json()方法具有不同的声明。最终结果是我得到了以下编译时错误:

enter image description here

我如何保护我的控制器声明免受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

enter image description here

简而言之:这个问题仅仅使用JSON下载问题来说明我正在做的事情。我如何确保当我声明控制器类是ApiController的子类时,它是Microsoft的API控制器,而不是Newtonsoft的?

0
0 Comments

问题的原因是在代码中使用了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),则不能使用别名来解决问题,只能使用全限定名称。

以上是对问题的原因和解决方法的整理和总结。

0
0 Comments

问题的原因是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时,浏览器弹出了一个名为.json的文件下载提示框,开始寻找将结果直接返回到响应体中的方法。这可能导致了上述的错误。默认的内容分发可能有问题。我猜您在使用Internet Explorer,它不喜欢渲染JSON。如果我从.ashx返回相同的JSON,它会被显示。我在这个问题上提了另一个问题,链接在这里:stackoverflow.com/q/48777442/2721750

0