Javascript 如何检查我的响应是字符串还是JSON对象?
我希望我的响应是JSON对象。但在某些函数中,它是字符串,我想解析它。我怎样才能做到这一点?这是我的职责Javascript 如何检查我的响应是字符串还是JSON对象?,javascript,jquery,json,Javascript,Jquery,Json,我希望我的响应是JSON对象。但在某些函数中,它是字符串,我想解析它。我怎样才能做到这一点?这是我的职责 function serverRequest(requestDATA, successCallback, errorCallback, hideIndicator, showAlert){ var METHOD = "POST"; var serverURL = 'http://istudy.com.pk/api/server.php'; //Path to Server.p
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."}"
responseText:“{”status:“success”,“message:“您的订单已处理。请注意此pin osIyKvAp,并将其发送给管理员,并提供付款详细信息。”}”
这是我的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);
}
函数确认\u顺序($id,$newarray,$cn){
$today=日期('y-m-d');
$expiry=日期('Y-m-d',标准时间(+30天));
$total_items=0;
$total_price=0;
foreach($newarray作为$key=>$val){
$total_items++;
foreach($val作为$doc){
$total_price=$total_price+$doc->doc_price;
}
}
$pin=随机字符串('alnum',8);
$sql=“插入订单(订单id、订单用户id、订单总额、订单金额、创建日期、订单状态、订单pin)
值(“,“$id.”、“$total_items.”、“$total_price.”、“$today.”、“$0.”、“$pin.”);
if(mysqli_查询($cn,$sql)){
$order\u id=mysqli\u insert\u id($cn);
foreach($newarray作为$key=>$val){
$total_docs=0;
$total_items++;
$sep=“|”;
$sub_价格=0;
$doc_list='';
foreach($val作为$doc){
$doc\u list.=$doc->doc\u id.$sep;
$sub_price=$sub_price+$doc->doc_price;
$total_docs++;
$sep=“|”;
}
$sql=“插入购物车项目(uc_id、uc_用户id、uc_课程id、uc_课程文档id、uc_课程文档编号、uc_价格、uc_订单编号、uc_订单状态、uc_dateBuy、uc_dateExpire)
值(“,“$id.”、“$key.”、“$doc_list.”、“$total_docs.”、“$sub_price.”、“$order_id.”、“$0.”、“$today.”、“$expiration.”);
mysqli_查询($cn,$sql);
}
$response_数组['status']='success';
$response_array['message']='您的订单已处理。请注意此pin。'$pin'。并将其发送给管理员并提供付款详细信息。';
}否则{
$response_数组['status']='error';
$response_array['message']='发生错误。请稍后再试';
}
echo json_encode($response_数组);
}
当且仅当我的响应为字符串时,我可以对JSON.parse进行任何检查吗?您可以使用相当简单的javascript来实现这一点:
if (typeof(data) == 'string') {
data = JSON.parse(data);
}
如果您对它为什么不能自动解析JSON感到好奇,以下是几个常见的原因:
- 无效的JSON(请检查jsonlint.com)
- 在需要json时未获取
内容类型(如dataType参数中设置的)应用程序/json
if (typeof (response) != 'object'){
response = JSON.parse(response);
}
将此添加到成功处理程序中
data = typeof data === 'string' ? data : JSON.parse(data);
删除
数据类型='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);
}
});
}
注意。这不会避免问题,但会让我们解析响应,同时服务器可能会有错误响应,即Content-Type
不是application/json
。一些web服务器会同时接受Content-Type:text/plain
和Content-Type:application/json;
标题,而returning在这两种情况下,$.ajax解析的都是json格式的字符串
,而不是json对象
(当发现应用程序/json
作为内容类型
头值时)
要实现这一点,请确保在php
代码中打印出正确的标题
<?php
header('Content-Type: application/json`)
我必须在我的成功中写这篇文章?我在我的消息中包含了html。这是原因吗?这也是我的另一个问题,它有完整的细节。当你设置数据类型:“json”
时,它会自动将响应解析为json。不需要手动执行。你可以echo json\u encode($response\u array)
但是你确定你在做头('Content-Type:application/json')
吗?是的,在我的server.php中,CORS的正下方,我是.3rd lineI console.log(typeof(data)),它是object。但是它说的是parseerror。有什么想法吗?这可能是由于一个错误的json对象。如果你做json.stringify(data)
你会得到什么?{“status”:“成功”,“消息”:“您的订单已处理。请注意此pin KTDZoFxf并将其发送给管理员,并提供付款详细信息。”}好的,这是一个有效的JSON对象,因此您从哪里得到此错误,即哪一行?反证为:JSON.parse(JSON.stringify(data))
您将得到解析后的json对象。出于某种原因,我无法理解您的success函数中的内容。您将其称为数据
而不是响应