我有一个php文件,对数据进行一些操作,然后以json
格式发送数据(据说)。
然后我使用ajax在js文件中接收数据。这是一个跨域操作,然后我需要使用jsonp。
问题是我收到了错误
对象{readyState:4,状态:200,statusText:“成功”} parsererror - 错误:jQuery1123030211047915085665_1465277732410原为 没有叫(...)
我认为这是因为我没有收到数据作为json对象,而是作为一个简单的字符串(当我将数据类型从jsonp更改为文本时,它转到.done
块)。
如何将数据作为json对象接收,而不是简单的字符串?
代码:
PHP:
if ( $moeda ==='SEK' ){
foreach($result as $r){ //$result is an array with the result of a sql query
//here I do some verifications, that depending on the circunstance, calculate and replace
//the value of the $r['price'] field.
if($r['currency'] === "SEK"){
$valor = $r['tprice'];
$r['tprice'] = number_format($valor,2,'.','');
}else if ($r['currency'] === "BRL"){
$dat = $r['emissao'];
$valor = $r['tprice'];
$r['tprice'] = number_format( ( converteBRL_SEK($dat,$valor) ) ,2,'.','');
}else if ($r['currency'] === "USD"){
$dat = $r['emissao'];
$valor = $r['tprice'];
$r['tprice'] = number_format(( converteUSD_SEK($dat,$valor) ),2,'.','');
}else if ($r['currency'] === "EUR"){
$dat = $r['emissao'];
$valor = $r['tprice'];
$r['tprice'] = number_format(( converteEUR_SEK($dat,$valor) ),2,'.','');
}
else{
echo 'error';
}
$retorno['dados'] = $r;
// using the GET callback because I'm using jsonp.
echo $_GET['callback'] . '('.json_encode($retorno,JSON_PRETTY_PRINT).')';
}
修改 我忘了发布javascript代码,这里是:
代码:
function buildTableDetail(p_sts,p_ar){
$('#tb_detail').empty();
return $.ajax({
type:'GET',
crossDomain:true,
url:'http://localhost/files/montar_detail_local.php?callback=?',// I use a real url, localhost just for the example
dataType:'jsonp',
data: {area:p_ar,
st:p_sts},
beforeSend: function(){
$('#t_detail').css('opacity','1.0');
console.log(p_ar);
console.log(p_sts);
}
}).done(function(data){
//after I get the data, I build a table, and format some values here...
$('#tb_detail').empty();
console.log("AREA:"+p_ar);
for (i = 0; i < data.dados.length; i++) {
$('#tb_detail').append('<tr> <td>'+data.dados[i].proposal+
'</td><td class="h_detail old_no" >'+data.dados[i].old_no+
'</td><td class="h_detail emissao" style="white-space: nowrap;">'+data.dados[i].emissao+
'</td><td class="h_detail area">'+data.dados[i].area+
'</td><td class="h_detail country">'+data.dados[i].country+
'</td><td class="h_detail ec_name">'+data.dados[i].ec_name+
'</td><td class="h_detail distributo">'+data.dados[i].distributo+
'</td><td class="h_detail project">'+data.dados[i].project+
'</td><td>'+float2moeda(data.dados[i].tprice)+
'</td><td class="h_detail gm">'+data.dados[i].gm+
'</td><td >'+data.dados[i].prob+
'</td><td class="h_detail st">'+(data.dados[i].st).substr(0,1)+'</td></tr>');
console.log(data.dados[i].proposal);
console.log(data.dados[i].distributo);
}
})
.fail(function(data, textStatus, errorThrown){
alert("Erro na operação.");
console.log(data);
console.log(textStatus);
console.log(errorThrown);
})
}
EDIT2:
刚刚更新了这一行:
echo $_GET['callback'] . '('.json_encode($retorno,JSON_PRETTY_PRINT).')';
到这个
echo $_GET['callback'] . '('.json_encode($retorno,JSON_PRETTY_PRINT).');';
并且错误不再显示。但是,它没有进入for
循环,也没有显示任何数据。我使用了console.log(data.dados.lenght)
并且它向我返回'undefined',所以我无法循环。
有什么想法吗?
答案 0 :(得分:2)
JSON只不过是一个字符串。如果您使用jQuery将json字符串转换为对象,请在javascript中使用$ .parseJSON。
答案 1 :(得分:1)
尝试以下方法:
if ( $moeda ==='SEK' ){
foreach($result as $r){ //$result is an array with the result of a sql query
//here I do some verifications, that depending on the circunstance, calculate and replace
//the value of the $r['price'] field.
if($r['currency'] === "SEK"){
$valor = $r['tprice'];
$r['tprice'] = number_format($valor,2,'.','');
}else if ($r['currency'] === "BRL"){
$dat = $r['emissao'];
$valor = $r['tprice'];
$r['tprice'] = number_format( ( converteBRL_SEK($dat,$valor) ) ,2,'.','');
}else if ($r['currency'] === "USD"){
$dat = $r['emissao'];
$valor = $r['tprice'];
$r['tprice'] = number_format(( converteUSD_SEK($dat,$valor) ),2,'.','');
}else if ($r['currency'] === "EUR"){
$dat = $r['emissao'];
$valor = $r['tprice'];
$r['tprice'] = number_format(( converteEUR_SEK($dat,$valor) ),2,'.','');
}
else{
echo 'error';
}
$retorno['dados'][] = $r; //append to the array
}
// using the GET callback because I'm using jsonp.
echo $_GET['callback'] . '('.json_encode($retorno,JSON_PRETTY_PRINT).');'; //echo the valid call of the callback
答案 2 :(得分:0)
尝试使用JSON_FORCE_OBJECT
代替JSON_PRETTY_PRINT
。
echo $_GET['callback'] . '('.json_encode($retorno,JSON_FORCE_OBJECT).')';