2014-09-24 54 views
0

我在下面的代碼中遇到了一些麻煩。控制檯數收益:如何避免從PHP返回的JSON中的反斜槓?

"returningList{"view":0,"new":1,"random":1} result: "{\"view\":0,\"new\":1,\"random\":1}"" 

正如你可以看到它的收單反斜線,使其不再JSON,儘管指定datatype : 'json'

問題似乎發生在從PHP讀回javascript的結果,因爲如果我在寫回$jsonArr到MySQL之前回顯SQL數據顯示正確的字符串(即沒有反斜槓)。

請幫忙,因爲這種明顯的瘋狂真的讓我興奮起來。我想要做的就是獲取我的數據 - 在我的實際代碼中,我通常不會返回作爲數據傳入的JSON,但這裏只需證明這一點就足夠了。我認爲'json'數據類型意味着它會接受回聲JSON而不會破壞它。

對於以下直言不諱,但爲了迴應類似的問題,我看到人們只是說「它逃避了引號」,就好像那個回答了這個問題 - 在這種情況下,至少它似乎沒有:顯然(AFAIK)是反斜槓的來源,但引號是JSON語法的一部分(它知道它是期望的),而不是字段內容的一部分,所以它們顯然不應該被轉義。我需要一個解決方案請。謝謝。

window.newGot = listBuild({ 
    'view' : 0, 
    'new' : 1, 
    'random' : 1 
}); 

function listBuild(options) 
    //Fill the new list. 
    return $.ajax({ 
     type : "POST", 
     url : "./php/getList.php", 
     cache : false, 
     data : { 
      options : JSON.stringify(options) 
     }, 
     datatype : "json" 
    }).then(function(jsonList) { 
     console.log('returningList' + JSON.stringify(options) + ' result: ' + JSON.stringify(jsonList)); 
     return jsonList; 
    }); 
} 

這裏的php文件內容:

<?php 
$options = json_decode($_POST['options'], true); 
$jsonArr = json_encode($options); 
echo $jsonArr; 
+1

的斜線不會引起任何問題,這是相當正常的,因爲據我所知? – adeneo 2014-09-24 18:10:49

+2

爲什麼您將JSON作爲字符串傳遞給'data',然後在服務器端對其進行解碼,是沒有意義的? – adeneo 2014-09-24 18:12:23

+0

@adeneo - 我也有點困惑,爲什麼你要處理的數據也是這種感覺 - 你不能把它作爲一個對象,並允許AJAX函數來處理轉換? – 2014-09-24 18:14:08

回答

1
無論

真實生成JSON可能是編碼雙,例如

$arr = array(); 
foreach($data as $foo) { 
    $arr[] = json_encode($foo); 
} 
echo json_encode($arr); 

在輸出到客戶端之前,JSON編碼應該是執行的最後一步。

例如

$foo = 'This is a string'; 
$foo_step1 = json_encode($foo); // "This is a string" 
$foo_step2 = json_encode($foo_step1); // "\"This is a string\"" 
0

根據其中的問題是,這可能是因爲你透過JSON.stringify,你嘗試解析它作爲JSON呢?

如果您包含jquery庫,那麼Jquery具有以下內容,否則瀏覽器還有一個: $。parseJSON()

http://api.jquery.com/jquery.parsejson/

其他問題可能是因爲你是雙編碼它

還通過驗證運行它,這不是有效的代碼

http://jsonlint.com/

「returningList {「view」:0,「new」:1,「random」:1} result:「{\」view \「:0,\」new \「:1,\」random \「:1}」「

這是我所期待的JSON看起來像

{ 
"returningList": { 
    "view": 0, 
    "new": 1, 
    "random": 1 
}, 
"result": { 
    "view": 0, 
    "new": 1, 
    "random": 1 
} 

}

+0

Re「那不是有效的代碼」什麼是無效的代碼?請不要將我生成的控制檯輸出與我想要的echo或返回結果混淆。控制檯輸出是用於調試的,任何類似的東西都可能是有效的,純屬巧合。 – SteveC 2014-09-25 01:43:17

+0

對不起 - 我的意思是任何相似的(字面意思)整個控制檯輸出到有效的JSON是巧合。 – SteveC 2014-09-25 01:53:09

0

顯然jsonList是JSON字符串,而不是解碼的對象,它代表。所以當你打電話給JSON.stringify()時,你需要重新編碼字符串。

當您指定dataType: 'json'時,jQuery應該自動解碼響應。我知道它在success:選項中指定回調時執行此操作,但在您使用.then()時看起來不會這樣做。請嘗試使用.done()代替。

就這樣說,我試圖在jsfiddle重現你的結果,而不是。

http://jsfiddle.net/barmar/53jthkyu/4/