AJAX - JSON语法错误

时间:2014-02-27 17:47:05

标签: javascript php ajax json

我正在为客户开发项目,他们希望能够根据注册人身份作为会员/非会员或学生动态更新费用列表。所以我认为AJAX是最好的方法,但我的实现遇到了麻烦。每次我发送我的对象时,我都会收到语法错误。我已将代码放在下面。

的JavaScript

function checkMember(){
    var member = document.getElementById("user_mem_id");
    if(member.value == "" || member.value.trim() == ""){
        document.getElementById("testError").innerHTML = "Please enter a membership id<br>";
        document.getElementById("testError").style.color = "red";
    }else{
        var json = { "data":[{"membership_id":member.value}]}
        var xmlHttp = false;
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");// For Old Microsoft Browsers
        }catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");// For Microsoft IE 6.0+
            }catch (e2) {
                xmlHttp = false;// No Browser accepts the XMLHTTP Object then false
            }
        }

        if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
            xmlHttp = new XMLHttpRequest();//For Mozilla, Opera Browsers
        }

        xmlHttp.open("POST","member_check.php",true);
        xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xmlHttp.send("data=" + json); 

        xmlHttp.onreadystatechange=function(){
            if (xmlHttp.readyState==4 && xmlHttp.status==200){
                    document.getElementById("testError").innerHTML=xmlHttp.responseText;
                    console.log(xmlHttp.responseText);
                    json_last_error;
            };
        };
    }
}

PHP

<?php

    if(isset($_POST["data"]))
    {
        $data = $_POST["data"];
        $res = json_decode($data, true);
        echo $data[membership_id];
    }

另一个问题是,当我尝试访问数据数组的成员资格“单元格”时,我从设置字符串中获取非法。因此我认为我已经错误地声明了我的原始JSON对象,但是我出现了(因为我在这里看到了很多例子,而且在那里),我已经正确地声明了这一点。

3 个答案:

答案 0 :(得分:2)

我认为您需要使用stringify才能成功执行帖子。

var json = { "data":[{"membership_id":member.value}]};
json_data = JSON.stringify(json);

然后在你的ajax调用中使用json_data。

答案 1 :(得分:1)

您的代码存在很多问题。正如我在给你的第一条评论中所述,你需要先将json转义为在查询字符串中发送之前,因为json转换为字符串,而没有应用任何特殊规则变成[object Object],这不是有效的json,也不是这样解析的。

为此,请使用JSON.stringify(json);。例如:

    function checkMember(){
    var member = document.getElementById("user_mem_id");
    if(member.value == "" || member.value.trim() == ""){
        document.getElementById("testError").innerHTML = "Please enter a membership id<br>";
        document.getElementById("testError").style.color = "red";
    }else{
        var json = { "data":[{"membership_id":member.value}]}
        var xmlHttp = false;
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");// For Old Microsoft Browsers
        }catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");// For Microsoft IE 6.0+
            }catch (e2) {
                xmlHttp = false;// No Browser accepts the XMLHTTP Object then false
            }
        }

        if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
            xmlHttp = new XMLHttpRequest();//For Mozilla, Opera Browsers
        }

        xmlHttp.open("POST","member_check.php",true);
        xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xmlHttp.send("data=" + JSON.stringify(json));
        //json turned into proper string
        //I should also note, you should url-encode this string if it contains
        //any special characters using encodeURIComponent()

        xmlHttp.onreadystatechange=function(){
            if (xmlHttp.readyState==4 && xmlHttp.status==200){
                    document.getElementById("testError").innerHTML=xmlHttp.responseText;
                    console.log(xmlHttp.responseText);
                    //json_last_error; //Commented this out, as it will
                    //echo an error, causing the script to halt, as it doesn't
                    //exist.
            };
        };
    }
}

其次,您发送一个对象,其关键字'data'包含一个对象数组..而不是一个简单的对象:

<?php

if(isset($_POST["data"]))
{
    $data = $_POST["data"];
    $res = json_decode($data, true);
        echo $data[membership_id]; // There are many things wrong here
        //     ^       ^ this is not a constant and likely does not exist.
        //     |- This is still your string, which doesn't work
}
<?php

if(isset($_POST["data"]))
{
    $data = $_POST["data"];
    $res = json_decode($data, true);
        echo $res['data'][0]['membership_id'];
        //      ^   ^     ^      ^
        //      |   |first item  |-string
        //The result|-string
}

希望我的评论是自我解释的..但是如果它们不是...... $ res是你的解码数组,'data'是该数组的第一个位置,0是该位置的数组的第一个位置,'membership_id'是您要访问的项目。您可以将成员作为字符串,索引作为整数访问。

答案 2 :(得分:1)

您的代码的基本问题是&#34 ;;&#34;定义变量时的终止符。检查以下行

  

json = {&#34; data&#34;:[{&#34; membership_id&#34;:member.value}]}

你还没有在结尾处加上分号。 (但它可能仍然会工作几次,但主要是它的错误)

相反,你也写了很多代码。我建议你使用jquery的$.ajax函数来简化你的任务。

如果您的json数据中只有成员资格ID,则更容易创建一个像下面那样的json对象

  

var json = {&#34; membership_id&#34; :member.value&#34; };

此外,您需要使用JSON.stringify(json)

在字符串中引用后发送您的json数据