【问题标题】:JSON seems to be double encoded by VB Web ServiceJSON 似乎是由 VB Web Service 双重编码的
【发布时间】:2013-03-06 17:59:38
【问题描述】:

在 VB.NET 中工作。这是我的 Web 服务 - 它是页面背后的 aspx 代码上的一种方法,尽管它在 asmx 中的行为相同:

<WebService(Namespace:="http://mycompany/WebServices/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ScriptService()> _
Partial Class AnAspxPageCodeBehind
    Inherits System.Web.UI.Page

    <WebMethod()> _
    <ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
    Public Shared Function GetSettings(param As String) As String
        Dim something As AClass = DoSomethingWith(param)

        Return New JavaScriptSerializer().Serialize(something)
    End Function

我这样称呼它:

var dataToSend = '{"param":' + data + '}';

$.ajax({
    url: 'AnAspxCodeBehind.aspx/GetSettings',
    type: 'POST',
    data: dataToSend,
    contentType: "application/json; charset=utf-8",
    datatype: 'json',
    success: function (data) {
        var ret = JSON.parse(JSON.parse(data).d);
    }
});

注意到成功函数中的双 JSON.parse 调用了吗?当我之前(使用 C#)完成 Web 服务时,我只需要执行 var ret = JSON.parse(data.d)。

谁能告诉我这里发生了什么?

谢谢

大卫

【问题讨论】:

  • 注意 responseformat 属性?这告诉框架该做什么。它为您进行序列化。

标签: vb.net json web-services parsing


【解决方案1】:

WebService 框架会根据请求自动将结果序列化为 XML 或 JSON。您不应该手动进行 JSON 序列化,如果这样做,您最终会得到双重编码的结果。

只需从您的函数中返回一个常规字符串、对象或对象列表。框架将完成其余的工作。在你的情况下,声明函数As AClass

您也无需在客户端调用JSON.parse。 jQuery 会为你解析它并将解析后的对象传递给data

【讨论】:

  • 好的 - 我会试一试。但是为什么 C# 和 VB 之间的行为不同呢?
  • 好吧,服务器端的代码看起来不错,但是在客户端我还是要做 JSON.parse(data).d。过去我做过 JSON.parse(data.d)。
  • @DavidHyde 显然您的 C# 服务设置不同。也许它有不同的属性应用于类,或者它根本不是一个 WebService 应用程序。我刚刚使用您问题中的属性设置了一个 C# WebService 应用程序,它的工作原理与 VB 版本完全相同。
  • @DavidHyde JSON.parse(data.d) 没有太大意义——它需要 data 已经被解析,d 包含双编码的 json。在我的测试设置中,success: function (data) {alert(data.d.foo);} 工作正常,foo 是返回的AClass 对象的属性。
猜你喜欢
  • 2023-04-02
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多