2009-02-28 6 views
0

我正在使用JSON解析數據並連接到PHP文件。我不確定是什麼問題,因爲我是一個新手彎曲。這是我收到的錯誤:使用FLEX和PHP的JSON解析錯誤

JSONParseError: Unexpected < encountered 
    at com.adobe.serialization.json::JSONTokenizer/parseError() 
    at com.adobe.serialization.json::JSONTokenizer/getNextToken() 
    at com.adobe.serialization.json::JSONDecoder/nextToken() 
    at com.adobe.serialization.json::JSONDecoder() 
    at com.adobe.serialization.json::JSON$/decode() 
    at DressBuilder2/getPHPData() 
    at DressBuilder2/__getData_result() 
    at flash.events::EventDispatcher/dispatchEventFunction() 
    at flash.events::EventDispatcher/dispatchEvent() 
    at mx.rpc.http.mxml::HTTPService/http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent() 
    at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::resultHandler() 
    at mx.rpc::Responder/result() 
    at mx.rpc::AsyncRequest/acknowledge() 
    at DirectHTTPMessageResponder/completeHandler() 
    at flash.events::EventDispatcher/dispatchEventFunction() 
    at flash.events::EventDispatcher/dispatchEvent() 
    at flash.net::URLLoader/onComplete() 

下面是實際的MXML代碼:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="535" height="345"> 
<mx:Script> 
<![CDATA[ 
import mx.events.DataGridEvent; 
import mx.controls.TextInput; 
import mx.rpc.events.ResultEvent; 
import mx.collections.ArrayCollection; 
import com.adobe.serialization.json.JSON; 

[Bindable] 
private var dataArray:ArrayCollection; 

private function initDataGrid():void 
{ 
    dataArray = new ArrayCollection(); 
    getData.send(); 
} 

private function getPHPData(event:ResultEvent):void 
{ 
    var rawArray:Array; 
    var rawData:String = String(event.result); 
    rawArray = JSON.decode(rawData) as Array; 
    dataArray = new ArrayCollection(rawArray); 
} 

private function sendPHPData():void 
{ 
    var objSend:Object = new Object(); 
    var dataString:String = JSON.encode(dataArray.toArray()); 
    dataString = escape(dataString); 
    objSend.setTutorials = "true"; 
    objSend.jsonSendData = dataString; 
    sendData.send(objSend); 
} 

private function updatedPHPDataResult(event:ResultEvent):void 
{ 
    lblStatus.text = String(event.result); 
} 

private function checkRating(event:DataGridEvent):void 
{ 
    var txtIn:TextInput = TextInput(event.currentTarget.itemEditorInstance); 
    var curValue:Number = Number(txtIn.text); 
    if(isNaN(curValue) || curValue < 0 || curValue > 10) 
    { 
    event.preventDefault(); 
    lblStatus.text = "Please enter a number rating between 0 and 10"; 
    } 
    } 
]]> 
</mx:Script> 
<mx:HTTPService id="getData" url="http://www.keishalexie.com/imd465/forum.php" 
useProxy="false" method="GET" resultFormat="text" 
result="getPHPData(event)"> 
<mx:request xmlns=""> 
    <getTutorials>"true"</getTutorials> 
    </mx:request> 
</mx:HTTPService> 
<mx:HTTPService id="sendData" url="http://www.keishalexie.com/imd465/forum.php" 
useProxy="false" method="GET" resultFormat="text" 
result="updatedPHPDataResult(event)"> 
</mx:HTTPService> 
<mx:Binding source="dgData.dataProvider as ArrayCollection" 
destination="dataArray"/> 
<mx:Panel x="0" y="0" width="535" height="345" layout="absolute" 
title="Forum"> 
    <mx:DataGrid id="dgData" x="10" y="10" width="495" height="241" 
    dataProvider="{dataArray}" creationComplete="{initDataGrid()}" 
    editable="true" itemEditEnd="{checkRating(event)}"> 
    <mx:columns> 
    <mx:DataGridColumn headerText="Name" dataField="name" editable="false"/> 
    <mx:DataGridColumn headerText="Author" dataField="author" width="115" 
     editable="false"/> 
    <mx:DataGridColumn headerText="Rating" dataField="rating" width="50" 
     editable="true" /> 
    </mx:columns> 
    </mx:DataGrid> 
<mx:Button x="10" y="259" label="UpdateDatabase" id="butUpdate" 
    click="{sendPHPData()}"/> 
    <mx:Label x="140" y="261" id="lblStatus"/> 
</mx:Panel> 
</mx:Application> 

這裏是PHP:

<?php 
    $USERNAME = ''; //database username 
    $PASSWORD = ''; //database password 
    $DATABASE = ''; //database name 
    $URL = '';  //database location 

    if(isset($_GET['getTutorials'])) { 
    mysql_connect($URL, $USERNAME, $PASSWORD); 
    mysql_select_db($DATABASE) or die('Cannot connect to database.'); 

    $returnArray = array(); 

    $query = 'SELECT * FROM Tutorials'; 
    $result = mysql_query($query); 

    while($row = mysql_fetch_assoc($result)) { 
     array_push($returnArray, $row); 
    } 

    mysql_close(); 
    echo json_encode($returnArray); 
    } 
    elseif(isset($_GET['setTutorials'])) { 
    $jsonString = urldecode($_GET['jsonSendData']); 
    $jsonString = str_replace("\\", "", $jsonString); 
    $data = json_decode($jsonString, true); 

    mysql_connect($URL, $USERNAME, $PASSWORD); 
    mysql_select_db($DATABASE) or die('Cannot connect to database.'); 

    foreach ($data as $tutorialEntry) { 
     $query = sprintf(
     'UPDATE Tutorials SET rating = "%s" WHERE id = "%s"', 
     mysql_real_escape_string($tutorialEntry['rating']), 
     mysql_real_escape_string($tutorialEntry['id'])); 

     $result = mysql_query($query); 

     if(!$result) { 
     mysql_close(); 
     echo mysql_error(); 
     return; 
     } 
    } 

    mysql_close(); 
    echo "database updated"; 
    } 
?> 

回答

1

看起來你有意想不到的<您JSON數據,聽起來像你從服務器回來的HTML,而不是乾淨的JSON。

使用firebug或http頭工具來檢查服務器的響應(或者只是在瀏覽器中加載url)並查看響應是什麼。

您可能需要在輸出JSON數據時禁用錯誤日誌記錄,或者如果您使用模板系統,則在發送JSON時不使用它。

+0

我正在使用as3corelib 92.1,因此我不確定在代碼中檢查或登錄附加<的位置。 – LaBopeep 2009-02-28 05:06:21

+0

使用螢火蟲,這是一個關於螢火蟲的快速指南。 http://www.ibm.com/developerworks/cn/library/wa-aj-firebug/index.html#N10242 – garrow 2009-02-28 08:49:46

0

看起來你的web服務器正在拋出一個HTML錯誤頁面。所以,是的。在解析之前記錄您要解析或放置斷點的JSON,並查看您想要解析的內容。