php json_encode&jquery parseJSON单引号问题

rev*_*evo 36 php jquery

我搜索并阅读了大部分相关主题,但它们并不是我想要的.

我有一个带有json_encodePHP函数的JSON enocded字符串:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987}
Run Code Online (Sandbox Code Playgroud)

我正在使用jQuery将值放在适当的字段中,在测试的情况下我做了以下操作:

<script>
var obj = jQuery.parseJSON('<?=$data?>');
console.log(obj);
</script>
Run Code Online (Sandbox Code Playgroud)

假设$ data是这样的:

$data =
<<<END
{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987}
END;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Google Chrome控制台会生成什么:

Uncaught SyntaxError: Unexpected identifier 
Run Code Online (Sandbox Code Playgroud)

但是,当我对JSON编码的字符串进行更改时 - 将反斜杠添加到单引号:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D\'Onofrio"],"year":1987}
Run Code Online (Sandbox Code Playgroud)

控制台输出正常:

Object {casts: Array[3], year: 1987}
casts: Array[3]
year: 1987
Run Code Online (Sandbox Code Playgroud)

问题是:控制台中的这个错误是预期的吗?我想逃避或更换'\'会这么脏!

更新

实际上$ data数据来自a json_encode($var)而$ var是一个数组!

$data = json_encode($var);
Run Code Online (Sandbox Code Playgroud)

sea*_*urt 70

对于在PHP中传递JSON编码字符串的更广泛问题(例如,通过cURL),使用JSON_HEX_APOS选项是解决此问题的最简洁方法.这也可以解决您的问题,虽然之前的答案是正确的,您不需要调用parseJSON,并且JavaScript对象是相同的,而不需要调用parseJSON $data.

对于您的代码,您只需进行此更改:

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

以下是jQuery正确编码数据的示例:http://jsfiddle.net/SuttX/

有关进一步阅读,请参阅PHP.net json_encode手册条目示例#2中的示例:

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

echo "Apos: ",    json_encode($a, JSON_HEX_APOS), "\n";
Run Code Online (Sandbox Code Playgroud)

这将输出:

Apos: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"]
Run Code Online (Sandbox Code Playgroud)

可以在此处找到JSON常量的完整列表:PHP.net JSON常量

  • 这非常有效。对于使用 twig 的人来说,代码是 json_encode(constant('JSON_HEX_APOS'))。感谢您提供这个解决方案。 (2认同)

Que*_*tin 17

但是,当我对JSON编码的字符串进行更改时 - 将反斜杠添加到单引号中

这在PHP字符串文字中逃脱了它.然后将其作为简单插入到PHP字符串中'.

如果你想将其插入JavaScript的前逃脱它,那么你需要斜线添加到你得到的字符串出来json_encode(或者说,因为你没有使用(你应该!)JSON字符串你手工打造).

那是你需要的更多工作.真正的解决方案是记住JSON是JavaScript文字语法的子集:

var obj = <?=$data?>;
Run Code Online (Sandbox Code Playgroud)

  • +1无需解析它 - `json_encode`的输出已经是有效的JavaScript. (10认同)
  • 嗨那里 - 派对有点晚了,但我有完全相同的问题,这就是修复!你能不能更详细地了解一下`<?= $ data?>`的意思?这是写出'<?php echo $ data;的一些简写版本; ?>或者那是不同的东西? (2认同)
  • @user1775598 你说得对:`&lt;?=` 是 `&lt;?php echo ` 的简写 (2认同)

hsu*_*suk 6

如果问题仅与单引号有关,那么这应该很简单:

str_replace("'", "\'", json_encode($array));
Run Code Online (Sandbox Code Playgroud)


Ora*_*ill 5

您面临的问题是您json_encode将 JavaScript 调用的结果显示为字符串,而它是有效的 JavaScript。从jQuery.jsonParse输出中删除set 并简单地将回显的结果分配给相关的 JavaScript 变量。

var obj = <?= json_encode(array("casts"=>array(
    "Matthew Modine","Adam Baldwin","Vincent D'Onofrio"
),"year"=>1987)); ?>;
Run Code Online (Sandbox Code Playgroud)