2011-09-18 231 views
19

我從PHP數組創建JSON字符串。我使用json_encode()對它進行了編碼。PHP JSON字符串,轉義JS輸出的雙引號

$data = array(
    'title' => 'Example string\'s with "special" characters' 
); 

$data = json_encode($data); 

$data使用wp_localize_script()本地化,是通過全球data變量訪問。

在JS文件I可以通過以下操作來訪問的信息:

var data  = data.replace(/"/g, '"'), 
    jsonData = jQuery.parseJSON(data); 

console.log(jsonData); 

這導致的輸出:導致成http://jsonlint.com/

{ "title":"Example string's with "special" characters" } 

輸入退貨錯誤。刪除「special」的雙引號會驗證字符串。

什麼是從PHP創建JSON字符串並將它正確地轉義以用於JS文件的最佳方式?

回答

8

http://www.php.net/manual/en/function.json-encode.php#100565

也就是說,行情「會產生無效的JSON,但這只是如果你使用json_encode()的問題,只是希望PHP神奇地逃脫你的報價,你需要做的。逸出自己

+30

所以你不能指望json_encode產生一個有效的json?我不會僱用這個開發人員 –

+7

@Joti您必須是PHP新手:P –

+5

這個答案儘管標記爲接受,但並不回答問題。 OP問:從PHP創建一個JSON字符串並將它正確地轉義以用於JS文件的最佳方法是什麼?這個答案說你需要逃避自己,但不提供最好的方式來做到這一點。 – Alex

18

另一種方法是使用htmlspecialchars編碼報價:

$json_array = array(
    'title' => 'Example string\'s with "special" characters' 
); 

$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8'); 
+11

不會將''''轉換爲'"' – colllin

+1

不適用於m – WonderLand

+0

好的提示,它可以很好地處理'data-'屬性(html5):)謝謝!+1 –

13

使用json_encode($ json_array,JSON_HEX_QUOT); 自PHP 5.3:http://php.net/manual/en/json.constants.php

+0

我正在格式化自己的json,只插入「{\」key \「:」。json_encode($ value)。「}」這樣的值,其中$ value是一個帶引號的字符串,這是最簡單的解決方案,對我來說是非常有用的JSON.parse(x)完美的作品在這種情況下 – Alex

15

我succefully只是這樣做:

$json = str_replace("\u0022","\\\\\"",json_encode($phpArray,JSON_HEX_QUOT)); 

json_encode()默認情況下會逃跑"\"。但它仍然是錯誤的JSON爲json.PARSE()。因此通過添加選項JSON_HEX_QUOT,json_encode()將替換"\u0022json.PARSE()依然不會像\u0022。那麼我們需要用\\"代替\u0022\\\\\"被轉義\\"

注意:如果您有javascript單引號問題,您可以添加選項JSON_HEX_APOS以用unicode HEX值替換單引號。

例如:json_encode($phpArray, JSON_HEX_APOS|JSON_HEX_QUOT));

+0

這個工作對我謝謝 – West55

+3

PHP: $ encodedData = json_encode($ phpArray,JSON_HEX_APOS | JSON_HEX_QUOT); JS:。<?PHP的echo $ encodedData> JSON.parse(' '); 完美。 – pirs

+0

是!!!這一個簡單的伎倆:)感謝您節省我的一天:) –

1

我只是碰到了這個問題,實際問題是,我忘了吐出的實際JSON數據之前加一個合適的應用程序/ JSON頭。

header('Content-Type: application/json');