【问题标题】:Decode Json Response from Ajax Call解码来自 Ajax 调用的 Json 响应
【发布时间】:2025-11-30 09:05:01
【问题描述】:

我通过我在本地主机上运行的 html 页面上的 ajax 调用从 python 脚本获得 json 响应。当我 alert/显示响应时,它是正确的 ajax 格式,但我不知道如何对其进行解码。 JSON 解析显示 [object] [object]。有什么帮助吗?提前致谢。

HTML:

function getData() {
    // Code doesn't even enter this function but when i remove the $.ajax part it enters the function
    alert("I AM HERE");

    $.ajax({
        type: "GET",
        datatype: 'json',
        url: "/cgi-bin/check.py",
        data: {
            action: 'muawia()',
        },
        success: function(data) {
            alert(data);
        },
        error: function(data) {
            alert(data.responseText);
        }
    });
};

Python:

#!/usr/bin/python

import cgi, cgitb 
from StringIO import StringIO
import json

class myclass:
    def __init__(self):
            self.data = []


    def muawia(self):
        content=json.loads('{"access": {"token": {"issued_at": "2013-04-18T14:40:23.299903", "expires": "2013-04-19T14:40:23Z", "id": "4c5ef01f52c7404fb5324c520d25d1fe", "tenant": {"description": "admin tenant", "enabled": true, "id": "51ad87714b86442d9a74537d6f890060", "name": "admin"}}, "serviceCatalog": [{"endpoints": [{"adminURL": "http://10.199.0.250:8774/v2/51ad87714b86442d9a74537d6f890060", "region": "RegionOne", "internalURL": "http://10.199.0.250:8774/v2/51ad87714b86442d9a74537d6f890060", "id": "9869f55f0de2490685676b6ec27f6097", "publicURL": "http://10.199.0.250:8774/v2/51ad87714b86442d9a74537d6f890060"}], "endpoints_links": [], "type": "compute", "name": "nova"}, {"endpoints": [{"adminURL": "http://10.199.0.250:8080", "region": "RegionOne", "internalURL": "http://10.199.0.250:8080", "id": "321601d827ba4bbbb6de1df69fd43a1c", "publicURL": "http://10.199.0.250:8080"}], "endpoints_links": [], "type": "s3", "name": "swift_s3"}, {"endpoints": [{"adminURL": "http://10.199.0.250:9292", "region": "RegionOne", "internalURL": "http://10.199.0.250:9292", "id": "cca7d7a24dbe45b6ae08da2c023b0d82", "publicURL": "http://10.199.0.250:9292"}], "endpoints_links": [], "type": "image", "name": "glance"}, {"endpoints": [{"adminURL": "http://10.199.0.250:8776/v1/51ad87714b86442d9a74537d6f890060", "region": "RegionOne", "internalURL": "http://10.199.0.250:8776/v1/51ad87714b86442d9a74537d6f890060", "id": "14773153229d4e7f80e47cf7b1dd2d15", "publicURL": "http://10.199.0.250:8776/v1/51ad87714b86442d9a74537d6f890060"}], "endpoints_links": [], "type": "volume", "name": "cinder"}, {"endpoints": [{"adminURL": "http://10.199.0.250:8773/services/Admin", "region": "RegionOne", "internalURL": "http://10.199.0.250:8773/services/Cloud", "id": "064df72a67f54dffa68c07b8fc400bdb", "publicURL": "http://10.199.0.250:8773/services/Cloud"}], "endpoints_links": [], "type": "ec2", "name": "nova_ec2"}, {"endpoints": [{"adminURL": "http://10.199.0.250:8080/", "region": "RegionOne", "internalURL": "http://10.199.0.250:8080/v1/AUTH_51ad87714b86442d9a74537d6f890060", "id": "194df182a8c043e48175a40fb615064e", "publicURL": "http://10.199.0.250:8080/v1/AUTH_51ad87714b86442d9a74537d6f890060"}], "endpoints_links": [], "type": "object-store", "name": "swift"}, {"endpoints": [{"adminURL": "http://10.199.0.250:35357/v2.0", "region": "RegionOne", "internalURL": "http://10.199.0.250:5000/v2.0", "id": "34db74b5f32f4121932725b1146a1701", "publicURL": "http://10.199.0.250:5000/v2.0"}], "endpoints_links": [], "type": "identity", "name": "keystone"}], "user": {"username": "admin", "roles_links": [], "id": "b5902682120742baa150945d8a37ff47", "roles": [{"name": "admin"}], "name": "admin"}, "metadata": {"is_admin": 0, "roles": ["9aa2eb385f4e4a8e80ad5002c212e76b"]}}}')
        data=json.dumps(content, indent=4, separators = (', ', ': '))
        print data
        return

print "Content-Type: text/html\n"
x = myclass()
x.muawia()

【问题讨论】:

  • 你应该返回一个 Content-Type 的 "application/json" 也不要使用 CGI!使用真正的 Python Web 框架。
  • 你试过 stringify 吗? *.com/questions/4810841/…
  • 您应该打印一个空行来分隔 HTTP 标头和正文..

标签: javascript jquery python ajax json


【解决方案1】:

你应该使用

console.log(data)

而不是警报(数据)。警报只会显示字符串

【讨论】:

    【解决方案2】:

    alert() 只输出字符串。所以通常它与以下内容相同:

    data = data.toString();
    alert(data);
    

    将 console.log 或 console.dir 与 JSON.parse 结合使用,以显示从 JSON.parse 返回的实际对象。

    // In your $.ajax success method
    var someVar = JSON.parse(data);
    console.log(someVar);
    

    您还可以将其临时设置为全局变量,以通过 Firebug/Chrome DevTools 控制台输入其名称进行调试。例如:

    // In your $.ajax success method
    window.data = data;
    

    然后在您的控制台中输入“数据”。

    请注意,将其交付到生产环境是一种不好的做法,全局变量不能被您的浏览器 JavaScript 引擎垃圾收集,尤其是全局变量名称,因为数据很可能会与其他全局变量发生冲突。如果您出于某种原因仍想使用全局,请确保使用可靠的命名约定以防止错误。

    【讨论】:

      【解决方案3】:

      这绝对是正常的,因为JSON.parse(stringData) 创建了普通的 JavaScript 对象,所以你会在警报中看到 [object Object]。您必须访问每个对象的属性以获取其值。在你的情况下 var jsonObj = JSON.parse(data); alert(jsonObj.access.token.issued_at);

      例如“2013-04-18T14:40:23.299903”

      【讨论】:

        【解决方案4】:

        您可以使用 $.parseJSON 正确格式化您的数据。您可能还想删除错误响应函数末尾的多余逗号。它可能导致语法错误。删除“action: 'muawia()'”中的逗号。

        success: function(data){
            r = $.parseJSON(data)
            alert(r.responseText);
        },
        error: function(data){
            r = $.parseJSON(data)
            alert(r.responseText);
        }
        

        希望这会有所帮助!

        【讨论】:

          最近更新 更多