2011-09-18 193 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');