如何检查我的响应是字符串还是 JSON 对象?

3
我希望我的响应以JSON对象形式返回。但在一些函数中,它以字符串形式返回,我想要解析它。我该如何实现?这是我的函数。
function serverRequest(requestDATA, successCallback, errorCallback, hideIndicator, showAlert){
    var METHOD = "POST";
    var serverURL = 'http://istudy.com.pk/api/server.php'; //Path to Server.php
    //var serverURL = 'http://localhost/istudy/server.php'; //Path to Server.php
    var DATA_TYPE = 'json';
    var TIMEOUT = 20000;
    console.log(requestDATA);
    $$.ajax({
        url: serverURL,
        data: requestDATA,
        dataType: DATA_TYPE,
        type: METHOD,
        timeout: TIMEOUT,
        success: function(data){
            successCallback(data, hideIndicator, showAlert);
        },
        error: function(a, b, c){
            errorCallback(a, b, c, hideIndicator, showAlert);
        }
    }); 
}

这是我的responseText

responseText: "{"status":"success","message":"Your Order has Processed. Please Note this pin <b style=\"background-color:green;\">osIyKvAp<\/b> and send it to the admin with payment details."}"

这是我的PHP函数

function confirm_order($id, $newarray, $cn) {
    $today = date('y-m-d');
    $expiry = date('Y-m-d', strtotime("+30 days"));
    $total_items = 0;
    $total_price = 0;
    foreach ($newarray as $key => $val) {
        $total_items++;
        foreach ($val as $doc) {
            $total_price = $total_price + $doc->doc_price;
        }
    }

    $pin = random_string('alnum', 8);

    $sql = "INSERT INTO orders (order_id, order_UserId, order_total_items, order_amount, date_created,order_status,order_pin)
    VALUES ('', '" . $id . "', '" . $total_items . "', '" . $total_price . "', '" . $today . "','0','" . $pin . "')";

    if (mysqli_query($cn, $sql)) {
        $order_id = mysqli_insert_id($cn);

        foreach ($newarray as $key => $val) {
            $total_docs = 0;
            $total_items++;
            $sep = '|';
            $sub_price = 0;
            $doc_list = '';
            foreach ($val as $doc) {
                $doc_list .= $doc->doc_id . $sep;
                $sub_price = $sub_price + $doc->doc_price;
                $total_docs++;
                $sep = '|';
            }

            $sql = "INSERT INTO cart_items (uc_id, uc_user_id, uc_course_id, uc_course_docs_id, uc_course_docs_num,uc_price,uc_order_num,uc_order_status,uc_dateBuy,uc_dateExpire)
            VALUES ('', '" . $id . "', '" . $key . "', '" . $doc_list . "', '" . $total_docs . "','" . $sub_price . "','" . $order_id . "','0','" . $today . "','" . $expiry . "')";

            mysqli_query($cn, $sql);
        }

        $response_array['status'] = 'success';
        $response_array['message'] = 'Your Order has Processed. Please Note this pin <b style="background-color:green;">' . $pin . '</b> and send it to the admin with payment details.';
    } else {
        $response_array['status'] = 'error';
        $response_array['message'] = 'An error occurred. Please try again later.';
    }
    echo json_encode($response_array);
}

如果我的响应是字符串,我可以在 JSON.parse 中放置任何检查吗?


1
当您设置 dataType: "json" 时,它会自动将响应解析为 JSON。无需手动操作。 - 4castle
你执行了 echo json_encode($response_array);,但在此之前你是否确保执行了 header('Content-Type:application/json') - loretoparisi
是的,在我的 server.php 文件中,在 CORS 下面,我在第三行。 - Ali Zia
4个回答

3
在你的成功处理程序中添加这个。
data = typeof data === 'string' ? data : JSON.parse(data);

0

您可以使用相对简单的JavaScript来实现:

if (typeof(data) == 'string') {
    data = JSON.parse(data);
}

如果你好奇为什么它不能自动解析你的JSON,这里有几个常见原因:

  • 无效的JSON(使用jsonlint.com检查)
  • 在期望JSON时没有得到application/json内容类型(如dataType参数中设置的)。

另请参阅:jQuery无法解析我的AJAX查询中的JSON


我需要在我的成功函数中编写这个吗? - Ali Zia
我在我的消息中包含了HTML代码。这可能是原因吗? - Ali Zia
这也是我的另一个问题,它包含了完整的细节。http://stackoverflow.com/questions/40759241/getting-parseerror-for-ajax-call-via-structural-functions - Ali Zia

0

“如果我的响应是字符串,我能在JSON.parse中放置任何检查吗?”

是的,你可以。

if (typeof (response) != 'object'){
response = JSON.parse(response);
}

在你的成功函数中,你将其称为 data 而不是 response - borbesaur

0

移除 DATA_TYPE = 'json'; 然后再试一次:

function serverRequest(requestDATA, successCallback, errorCallback, hideIndicator, showAlert){
    var METHOD = "POST";
    var serverURL = 'http://istudy.com.pk/api/server.php'; //Path to Server.php
    //var serverURL = 'http://localhost/istudy/server.php'; //Path to Server.php
    var TIMEOUT = 20000;
    console.log(requestDATA);
    $$.ajax({
        url: serverURL,
        data: requestDATA,
        type: METHOD,
        timeout: TIMEOUT,
        success: function(data){
            try {
               if(typeof(data)==='string') data=JSON.parse(data);
            } catch(ex) { // bad json response
               console.error(ex);
            }
            successCallback(data, hideIndicator, showAlert);
        },
        error: function(a, b, c){
            errorCallback(a, b, c, hideIndicator, showAlert);
        }
    }); 
}

注意。这并不会避免问题,但是可以让我们解析响应,同时在服务器返回可能出现的错误响应时,例如不是application/jsonContent-Type。一些Web服务器将接受Content-Type:text/plainContent-Type:application/json;头文件,并在两种情况下返回一个json格式字符串,而不是由$.ajax解析的json对象(当找到application/json作为Content-Type头文件值时)。

为了实现这一点,请确保在您的php代码中打印正确的头文件。

<?php

header('Content-Type: application/json`)

我使用console.log(typeof(data)),它显示为对象。但是它报错parseerror。有什么想法吗? - Ali Zia
这可能是由于错误的 JSON 对象导致的。如果你执行 JSON.stringify(data) 会得到什么? - loretoparisi
{"status":"成功","message":"您的订单已处理。请注意此 PIN 码 <b style="background-color:green;">KTDZoFxf</b> 并将其与付款详情发送给管理员。"} - Ali Zia
好的,所以这是一个有效的JSON对象,那么你在哪里得到了这个错误,即哪一行?反证法是:JSON.parse( JSON.stringify(data) ),你将得到解析后的JSON对象。 - loretoparisi
@AliZia 如果你在 error: 回调函数中添加 console.error(error),并在 success: 回调函数中的任何其他代码之前添加 console.log(data),那么你会在控制台中得到什么? - loretoparisi
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接