2013-07-29 54 views
21

我搜索並閱讀了大部分相關主題,但他們不是我正在尋找的。php json_encode&jquery parseJSON單引號問題

我有一個JSON字符串enocded與json_encode PHP函數:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987} 

我使用jQuery擺在適當的字段中的值也是如此,在測試的情況下,我沒了下文:

<script> 
var obj = jQuery.parseJSON('<?=$data?>'); 
console.log(obj); 
</script> 

假設$的數據是這樣的:

$data = 
<<<END 
{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987} 
END; 

什麼谷歌chromeç onsole產生在這種情況下:

Uncaught SyntaxError: Unexpected identifier 

然而,當我使JSON編碼的字符串的變化 - 將反斜槓到單引號:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D\'Onofrio"],"year":1987} 

控制檯輸出是正常:

Object {casts: Array[3], year: 1987} 
casts: Array[3] 
year: 1987 

問題:這是控制檯中的錯誤嗎?我認爲逃避或更換'\'將是如此的骯髒!

修訂

其實$數據值來自json_encode($var)和$ VAR是一個數組!

$data = json_encode($var); 

回答

13

然而,當我做出JSON編碼字符串的變化 - 增加反斜線單引號

逃脫它在PHP字符串常量。然後將它插入到PHP字符串中,作爲一個簡單的'

如果你想將其插入JavaScript的前逃脫它,那麼你需要斜線添加到你json_encode(或相當的字符串,因爲你沒有使用(你應該!)的JSON你用手建立的字符串)。

這是更多的工作,然後你需要,但。真正的解決辦法是要記住,JSON是JavaScript的文字語法的一個子集:

var obj = <?=$data?>; 
+0

json字符串不是手工構建的。請參閱更新。 – revo

+7

+1不需要解析它--json_encode的輸出已經是有效的JavaScript。 – cmbuckley

+0

這將是很好的指定'JSON_HEX_TAG | JSON_HEX_AMP'雖然。至少前者可能需要滿足[腳本元素內容的限制](http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#restrictions -for-contents-of-script-elements),如果文檔可以被解析爲XML,則兩者都是必需的。 – PleaseStand

4

你所面臨的問題是,你作爲一個字符串呈現json_encode調用的結果爲JavaScript,而它是有效的JavaScript 。從輸出中移除jQuery.jsonParse集,並簡單地將回顯結果分配給有問題的javascript變量。

var obj = <?= json_encode(array("casts"=>array("Matthew Modine","Adam Baldwin","Vincent D'Onofrio"),"year"=>1987)); ?>; 
+0

的簡寫,請參閱我的更新。 – revo

+0

上面的代碼將爲你工作......它也通過傳遞javascript parseJson步驟來顯示。 – Orangepill

53

對於PHP傳遞一個JSON編碼的字符串(例如,通過捲曲),使用JSON_HEX_APOS選項的更廣泛的問題是要解決這一問題的乾淨的方式。這也可以解決你的問題,雖然之前的回答是正確的,你不需要需要來調用parseJSON,並且JavaScript對象是相同的,不需要調用$data上的parseJSON。

爲您的代碼,你只想讓這種變化:

json_encode($var)json_encode($var, JSON_HEX_APOS)

下面的jQuery正在分析的正確編碼數據的一個例子:http://jsfiddle.net/SuttX/

對於進一步的閱讀,下面是從PHP.net json_encode manual entry實施例#2的例子:

$a = array('<foo>',"'bar'",'"baz"','&blong&', "\xc3\xa9"); 

echo "Apos: ", json_encode($a, JSON_HEX_APOS), "\n"; 

這將輸出:

Apos: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"] 

JSON常量的完整列表可以在這裏找到:PHP.net JSON constants

+7

謝謝!這個解決方案對我來說效果很好! –

+6

真棒和簡單的解決方案!兩年後挽救了我的生命。謝謝!! –

+1

這個解決方案仍然持有5年。你爲我節省了大量時間 – bmatovu