2013-07-03 114 views
0

我在最近10個小時遇到了一個奇怪的問題,它真的很煩人。問題出在jQuery打印來自php的json數據。 php腳本運行良好,但是當ajax調用返回完成時:事件我沒有得到任何有效的輸出。jquery ajax不解析php的json數據

這裏是jQuery代碼::

list_choice = "A"; 
content_choice = "Artists";    //globals to store default value 

$(document).ready(function() { 
$('.list-nav > a').click(function() { 
    var ltext = $(this).text(); 
    list_choice = ltext; 
    console.log(ltext+" <------> ");   
    $.ajax({    
     url: 'retrieveFileFront.php', 
     data: {type: content_choice, navtext: list_choice}, 
     type: 'POST', 
     dataType: 'json',    
     complete: function(data) {     
      console.log(data['message']['Album_Name']);   
     } 
    }); 
    return false; 
}); 

});

我不得不使用complete:event作爲成功:根本沒有工作。至少我從完整的事件中得到某種輸出,儘管它給出undefined[object][Object]這是完全荒謬的。

這裏是retrieveFileFront.php

<?php 

require './retrieveFiles.php'; 

$type = $_POST['type']; 
$nav_text = $_POST['navtext']; 

$ret_files = new retrieveFiles($type, $nav_text); 
$data = $ret_files->retFiles(); 
if ($data['success'] == FALSE) { 
    $data = array('success' => FALSE, 'message' => 'Sorry an Error has occured'); 
    echo json_encode($data); 

} else { 
    echo json_encode($data); 
} 

>

這裏是/retrieveFiles.php

<?php 

class retrieveFiles {   
    public $content_type; 
    public $list_nav; 
    public $connection; 
    public $result; 
    public $result_obj; 
    public $tags_array; 
    public $query; 
    public $row; 

    public function __construct($type, $nav_text) {    
     $this->content_type = $type; 
     $this->list_nav = $nav_text;  
    } 

    public function retFiles() { 

     @$this->connection = new mysqli('localhost', 'usr', 'pass', 'data'); 
     if(!$this->connection) { 
      die("Sorry Database connection could not be made please try again later. Sorry for the inconvenience.."); 
     } 

     if ($this->content_type == "Artists") {     

      $this->query = "SELECT album_name, album_art FROM album_dummy NATURAL JOIN album_images_dummy WHERE artist_name LIKE '$this->list_nav%'";    

      try { 
       $this->result = $this->connection->query($this->query); 
       $this->row = $this->result->fetch_row(); 

       if (isset($this->row[0]) && isset($this->row[1])) { 
        $this->tags_array = array("success" => true, "message" => array("Album_Name" => $this->row[0], "Album_Art" => $this->row[1])); 

        return $this->tags_array; 
       } 

     } catch (Exception $e) {     
       echo 'Sorry an Error has occurred'.$e; 
       return false; 
      } 
     } 
    } 

} 

>

我得到在控制檯200響應?螢火蟲,這表明它的運行沒問題。

<!DOCTYPE HTML> 

{"success":true,"message":{"Album_Name":"Streetcleaner","Album_Art":"\/var\/www\/html\/MusicLibrary\/Musics\/1989 - Streetcleaner\/folder.jpg"}}

現在,這是使我更糊塗了,因爲我可以看到JSON格式正確。請提供任何關於如何解決此問題的建議。

在此先感謝..

+0

您是否在您的JSON響應中添加了一個'<!DOCTYPE HTML>'前綴? – techfoobar

+3

1。您的JSON響應中不應該包含該HTML文檔類型; 2.你不應該打印本地路徑到文件,而是URL。 – moonwave99

+0

響應以字符串形式發送,而不是Javascript對象。請參閱下面的答案。 –

回答

1

JSON編碼的數據通常不喜歡送

data['message']['Album_Name']); 

而更像:

data.message.Album_Name; 

你調用你的結果走錯了路。這些不再是關聯數組,而是現在的對象,如名稱JSON(JavaScript Object Notation)所示。

+2

這不是你如何_send_ JSON數據 - 這如何訪問一個JS對象[可能已經從JSON反序列化字符串,但這完全不相關]。 – moonwave99

+0

好吧,它是;編碼之後,它看起來更像{「消息」:{「ALBUM_NAME」:「......」}},這將使它的對象,而不是關聯數組(雖然在Javascript這實際上是相同的,但是這是一個完全不同的討論。) –

+0

支架符號和點符號只是兩種不同的方式來訪問相同的數據,支架一個,如果你想提供例如動態密鑰是有用的。 – moonwave99

1

您需要在阿賈克斯解析使用

data = $.parseJSON(data) 
+3

如果他在ajax請求中指定了'dataType:JSON',則不需要。 – moonwave99

+0

哇,我的壞。顯然我跳過那一個。我會想象有什麼會得到OP不想要的回聲。可能值得將dataType設置爲文本,並使用alert(data)來查看返回的內容。 –

+0

@MichaelWheeler在發佈我的問題之前,我使用$ .parseJSON解析了它,但它沒有幫助。就像我說我已經花了超過10個小時在這個問題上,嘗試了不同的解決方法,但沒有奏效。 – Maxx

1

使用成功事件JSON響應,而不是完整的,我們可以能夠通過使用JSON.parse

+0

:JSON.parse :意外的字符 [打破這個錯誤] \t 回報window.JSON.parse(數據);在控制檯面板 – Maxx

+1

使用VAR解析度= JSON.parse(數據);直接 –

+0

這是我得到語法錯誤:JSON。解析:意外的字符 [打破這個錯誤] \t VAR高清= JSON.parse(數據); – Maxx

0

以及分析在JavaScript/jQuery的JSON編碼的數據經過長時間的創傷後,我終於找到了解決方案,結果證明我需要分析響應文本,然後分別訪問這些對象。 這裏是工作的代碼

list_choice = "A"; 
content_choice = "Artists";    //globals to store default value 

$(document).ready(function() { 
$('.list-nav > a').click(function() { 
    var ltext = $(this).text(); 
    list_choice = ltext; 
    console.log(ltext+" <------> "); 

    $('#loading').css('visibility', 'visible'); 

    $.ajax({ 
     url: 'retrieveFileFront.php', 
     data: {type: content_choice, navtext: list_choice}, 
     type: 'POST' 
     dataType: 'json', 
     complete: function(data) { 

      var res = data.responseText; 
      res = res.replace(/<!DOCTYPE HTML>/g, ""); 
      res = res.trim(); 

      console.log(res); 
      var arr = JSON.parse("[" + res +"]"); //needed to parse JSON object into arrays 
      console.log(arr[0].message.Album_Name); 
      console.log(arr[0].message.Album_Art);    

      $('#loading').css('visibility','hidden'); 
     } 
    }); 
    return false; 

}); 

這工作得很好,並給出所需的響應。無論如何謝謝你的幫助,夥計們。