【问题标题】:How can I check if my response is a string or JSON Object?如何检查我的响应是字符串还是 JSON 对象?
【发布时间】:2016-11-23 20:49:40
【问题描述】:

我希望我的响应是 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: "{"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 进行任何检查吗?

【问题讨论】:

  • 当您设置dataType: "json" 时,它会自动将响应解析为 JSON。无需手动操作。
  • 你做了echo json_encode($response_array);,但你确定你在那之前做的是header('Content-Type:application/json')吗?
  • 是的,在我的 server.php 中,就在 CORS 的下方,我是。第三行

标签: javascript jquery json


【解决方案1】:

将此添加到您的成功处理程序中。

data = typeof data === 'string' ? data : JSON.parse(data);

【讨论】:

    【解决方案2】:

    “当且仅当我的响应是字符串时,我可以对 JSON.parse 进行任何检查吗?” 是的你可以。

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

    【讨论】:

    • 在你的成功函数中。你称它为data 而不是response
    【解决方案3】:

    您可以使用相当简单的 javascript 来做到这一点:

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

    如果您对为什么它可能不会自动解析您的 JSON 感到好奇,这里有几个常见的原因:

    • 无效的 JSON(请访问 jsonlint.com)
    • 在期望 JSON 时未获得 application/json 内容类型(在 dataType 参数中设置。

    另请参阅:jQuery won't parse my JSON from AJAX query

    【讨论】:

    • 我必须在我的成功中写下这个?
    • 我的消息中包含了 html。会是这个原因吗?
    • 这也是我的另一个问题,它有完整的细节。 stackoverflow.com/questions/40759241/…
    【解决方案4】:

    删除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 formatted string 而不是由 $.ajax 解析的 json object(当找到 application/json 作为 Content-Type 标头值时)。

    要实现这一点,请确保在您的 php 代码中打印出正确的标题

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

    【讨论】:

    • 我 console.log(typeof(data)) 它是对象。但它说解析错误。有什么想法吗?
    • 这可能是由于错误的 json 对象。如果你这样做JSON.stringify(data) 你会得到什么?
    • {"status":"success","message":"您的订单已处理。请注意此图钉 KTDZoFxf 并将其与付款详情一起发送给管理员。"}
    • 好的,所以这是一个有效的 JSON 对象,那么你在哪里得到这个错误,即哪一行?反证是:JSON.parse( JSON.stringify(data) ) 你会得到你解析的 json 对象。
    • 由于某种原因我无法理解
    猜你喜欢
    • 2017-06-18
    • 2021-02-28
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2014-12-20
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多