2013-04-12 52 views
0

我有一個PHP後端,當查詢時,將返回一組JSON中的帖子。但是,因爲有多個帖子,所以它是在一個數組中。例如:(開頭的字符串只是一個JSONP回調)如何解析數組中返回的JSON?

jQuery19107630979726091027_1365800375610?_=1365800375611([ 
    { 
     "content": "Hello", 
     "time": "1349829544", 
     "info": { 
      "email": "[email protected]", 
      "username": "test", 
      "first": "Test", 
      "last": "User", 
      "id": "2" 
     } 
    }, 
    { 
     "content": "test.", 
     "time": "1349829535", 
     "info": { 
      "email": "[email protected]", 
      "username": "test", 
      "first": "Test", 
      "last": "User", 
      "id": "2" 
     } 
    } 
]) 

請注意JSON如何被括號包圍。當我使用jQuery腳本調用並分析這些數據時,出現錯誤「Uncaught SyntaxError:意外的輸入結束」,指向我括號所在的最後一行數據。 JS:

$("#getPosts").click(function(){ 
    $.getJSON("http://mysite.com/api/posts/list/byfriends/callback=?", function(data){ 
     $.each(data, function(){ 
      $('#posts').append("<li><p>"+this.content+"</br>By: "+this.info.first+" "+this.info.last+" ("+this.info.email+")"); 
     }); 
    }); 
}); 

最後,這裏是PHP發送JSON:

include('config.inc'); 
header("Content-type: text/javascript"); 
$posts = array(); 
$subscribe = "SELECT subscribed FROM subscribe WHERE subscriber = '{$_SESSION['id']}'"; 
$query = mysql_query("SELECT * FROM `posts` WHERE (`post_owner` IN ({$subscribe}) OR `post_owner` = {$_SESSION['id']}) ORDER BY `id` DESC"); 
$num = mysql_numrows($query); 
for ($i = 0; $i < $num; $i++) { 
    $post['content'] = mysql_result($query, $i, 'content'); 
    $post['time'] = mysql_result($query, $i, 'timestamp'); 
    $post['info'] = getInfo_other(mysql_result($query, $i, 'post_owner')); 
    array_push($posts, $post); 
} 
echo $callback."("json_encode($posts, JSON_PRETTY_PRINT).")"; 

回調變量起作用。我有一個簡單的PHP路由器設置來處理它。

+1

你沒有正確地做jsonp。 jquery有一個特定的格式,它尋找做一個jsonp請求:http://stackoverflow.com/questions/2681466/jsonp-with-jquery –

+0

我建議他也看看http://stackoverflow.com/questions/1678214/javascript-how-do-i-create-jsonp,它解釋瞭如何創建一個JSONP接口。 –

回答

0

下面是回調JSONP調用的響應的一個例子,它應如何被返回(在這種情況下的CouchDB):

請求:

http://whatever.com/couchdb/db/2010-07-09T23%3A57%3A38.500000Z?callback=a

響應:

a({ 
    "_id" : "2010-07-09T23:57:38.500000Z", 
    "_rev" : "1-750aa2bc0a40e32120e8f6af49b7e979", 
    "timestamp" : 2500, 
    "data" : { 
     "time" : "2010-07-09T23:57:38.500000Z", 
     "audio" : { 
      "crowd_score" : 0.012911000000000001, 
      "traffic_score" : 0.155251, 
      "applause_score" : 0.0, 
      "music_score" : 0.22573499999999999, 
      "@ID" : "freesound_org_100840", 
      "position" : 2.5 
     } 
    } 
}); 

嘗試在末尾添加分號,你生成的響應中的_應該被刪除,因爲它使得Javascript的事情發生了比較。

您的回答應該是這樣的:

jQuery19107630979726091027_1365800375610([{ 
       "content" : "Hello", 
       "time" : "1349829544", 
       "info" : { 
        "email" : "[email protected]", 
        "username" : "test", 
        "first" : "Test", 
        "last" : "User", 
        "id" : "2" 
       } 
      }, { 
       "content" : "test.", 
       "time" : "1349829535", 
       "info" : { 
        "email" : "[email protected]", 
        "username" : "test", 
        "first" : "Test", 
        "last" : "User", 
        "id" : "2" 
       } 
      } 
     ]); 

最後,你可以看看https://stackoverflow.com/a/1678243/1688441這是非常有趣的。

+0

好的。我非常想到使用$ .ajax進行固定回調。但是,由於我將URL路由到PHP文件(例如:/ api/posts/add - > /api/add.php),因此我無法使用GET請求。有沒有辦法避免使用基於GET的回調? –

+0

這將是使用不同的回調。 –

+0

對於將URL傳送到PHP文件有什麼意義?你是否在爲post/put等實現一個REST API? –