【问题标题】:vb.net web api $.ajax response not json objectvb.net web api $.ajax 响应不是 json 对象
【发布时间】:2015-06-17 05:28:37
【问题描述】:

尝试在 vb.NET 中进行一个简单的 Web api 调用,该调用返回 json,以便 jQuery ajax 响应已经是一个 javascript 对象。只是似乎无法正常工作。

' GET api/<controller>
Public Function GetValues()
    Dim json As New Dictionary(Of String, String)
    json.Add("status", "success")
    json.Add("msg", "good job")

    Dim serializer = New JavaScriptSerializer()
    Return serializer.Serialize(json)

    'Return JsonConvert.SerializeObject(json)
End Function

Ajax 调用:

$.ajax({
    url: "api/products",
    type: 'GET',
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify({key:'key'}),
    dataType: 'json',
    success: function (response) {
        console.log(response);  // prints {"status":"success","msg":"good job"}
        console.log(response.status);  // prints undefined
    }
});

Chrome 显示:
请求头:Content-Type:application/json;字符集=utf-8
响应头:Content-Type:application/json;字符集=utf-8
网络/响应选项卡显示:"{\"status\":\"success\",\"msg\":\"good job\"}"

它显然没有自动变成一个 javascript 对象,但我不知道为什么。如果我返回来自 JavaScriptSerialize.Serialize() 或 NewtonSofts JsonConvert.SerializeObject 的响应并不重要。

我必须在这里遗漏一些基本的东西。谁能指出我正确的方向?

【问题讨论】:

  • 您正在获取 json。您面临的问题是什么?
  • 基于我使用 dataType:'json' 为 jQuery $.ajax() 找到的所有文档,我应该从返回的 json 字符串中获取一个 javascript 对象,所以我不必做类似的事情JSON.parse() 使其成为一个对象。所以 console.log(response.status) 应该打印“成功”。也许我误解了文档?

标签: javascript jquery ajax json asp.net-web-api2


【解决方案1】:

所以我想出了我的愚蠢举动。将我序列化的内容作为字符串返回到 json 的函数,直到我另有说明。我放弃了 VB 并切换到 C# 也失败了。最后,我将 C# 版本从:
public string UploadFile()
更改为
public Dictionary&lt;string, string&gt; UploadFile()

它在 VB 中类似于
Public Function GetValues() As String
to
Public Function GetValues() As Dictionary(Of String, String)

然后我得到了一个 javascript 对象,而不必使用 JSON.parse() 之类的东西。 :-)

【讨论】:

    【解决方案2】:

    请尝试以下代码。我已将您的 JSON 响应转换为 javascript 对象。

    $.ajax({
        url: "api/products",
        type: 'GET',
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify({key:'key'}),
        dataType: 'json',
        success: function (response) {
        var objResponse = JSON.parse(response);
    
            console.log(response);  // prints {"status":"success","msg":"good job"}
            console.log(objResponse.status);  // prints undefined
        }
    });
    

    【讨论】:

    • 正如我上面提到的,文档表明我不必使用 JSON.parse() 之类的东西,它应该知道这是一个 json 响应并为我将其客观化。没有?
    • @JoelCool 您得到的响应是一个字符串,您需要将其转换为 JSON/Javascript 对象才能访问其属性。您不能从字符串变量访问属性。
    • 是的,我知道了。我想出了我的问题。无论您使用什么来序列化服务器响应(内置序列化例程或 NewtonSoft),它仍然会作为字符串返回,直到您告诉函数返回其他内容。所以我将:
      Public Function GetValues()
      改为:
      Public Function GetValues() As New Dictionary(Of String, String)
      然后它工作正常......呵呵!
    • @JoelCool 所以你可以把它标记为我猜的答案:)
    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2019-02-18
    • 2021-06-13
    相关资源
    最近更新 更多