从 ASP.Net Web 服务 json 输出中删除“d”对象

Posted

技术标签:

【中文标题】从 ASP.Net Web 服务 json 输出中删除“d”对象【英文标题】:Removing the "d" object from ASP.Net web service json output 【发布时间】:2011-02-18 04:26:25 【问题描述】:

我有一些 javascript 代码可以处理使用框架 2.0 构建的 asp.net Web 服务的 json 输出。现在我需要支持从框架 3.5 Web 服务返回的数据。

我的 javascript 代码假定一个对象列表作为返回值,这在 2.0 中可以正常工作。但是在框架 3.5 中,列表被包装在一个“d”对象中。有什么办法可以删除“d”包装并返回列表?

我希望在服务器端解决这个问题

【问题讨论】:

旁注:d 包装器是一种安全措施。见encosia.com/2009/02/10/… 相关:***.com/questions/830112/what-does-d-in-json-mean 【参考方案1】:

您不能将 3.5+ 服务配置为不返回 .d。它也在那里很好,因为它可以防止外部 JSON 实体是数组时存在的棘手的 JSON 劫持场景。

ASP.NET AJAX 的客户端代理会自动对您隐藏.d。如果它妨碍您,我假设您正在使用 jQuery 之类的东西来调用服务?以You can normalize the .d in jQuery by using its DataFilter callback 为例。

【讨论】:

谢谢。我使用mootools。会为 mootools 找到类似的东西或自己滚动【参考方案2】:

这是一种解决方法

    [WebMethod]
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
    public void Status()
    
        MyObject myObject = new MyObject(); // your object here
        var json = Newtonsoft.Json.JsonConvert.SerializeObject(myObject);

        HttpContext.Current.Response.Write(json);
    

【讨论】:

我看到你的答案后就很明显了。在我的 json 响应对象之后,我仍然得到 d json 对象,所以我添加了 ...Response.Flush() 和 ...Response.End() 以完全摆脱它。谢谢。【参考方案3】:

如果您有在客户端进行更改的优势,那么最好的方法是使用 jquery,您会找到大量的解决方案。但是,如果您想在服务层上删除“d”,最好的方法是在 Web Api 中重写您的 Web 服务(您也可以使用 WCF)。 Web Api 不返回“d”作为响应。

【讨论】:

以上是关于从 ASP.Net Web 服务 json 输出中删除“d”对象的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET - 使用 jQuery 实现基于 JSON 的 Web 服务的正确方法是啥?

使用 c# --> asp.net web api 在 json 中获取分层输出

ASP.NET Web API JSON 输出中没有时间的日期

如何使用 json 从 sql server ASP.net 中检索数据

扩展从 JQuery 调用 Web 服务时从 ASP.NET 引发的异常

如何从 ASP.NET Web 服务生成 JSONP 以进行跨域调用?