【问题标题】:Using PHP generated JSON in javascript : issues with backslashes在 javascript 中使用 PHP 生成的 JSON:反斜杠问题
【发布时间】:2014-08-29 16:30:46
【问题描述】:

我已经看到了一些相关的答案,其中 PHP 的 JSON 字符串中的特定字符被转换为 javascript 友好的版本。 在一些帮助下,我已经走到了这一步:

  • Javascript 不能很好地处理反斜杠,实际上这些需要用双反斜杠替换。
  • 换行符 \r\n 不能正常工作,要么您需要回车,要么完全删除这些符号。
  • 字符串中的双引号需要使用“双反斜杠”而不是单引号进行转义。
  • 在路径中被反斜杠转义的正斜杠不需要转义。

下面的非工作 json 示例(在 jsonlint 验证但在 JSON.parse 中失败)

["string\r\n next line \"quoted text\" and \b at path \/var\/opt "]

我需要在替换后转换为跟随以使其工作

["string next line \\"quoted text\\" and \\b at path /var/opt "]

问题

我的问题是我在 php 中的 json 依赖于用户输入,我不知道他们会放什么。 PHP 将使用标准的 json 转换方法并进行验证。

和上面一样,我还应该涵盖其他场景,特别是 unicode 、其他特殊字符等吗?

更新

我的json字符串比这个例子复杂一点,动态变化,一个小例子是

{ "settings.conf": [ "tooltip='dynamic unicode text multiline with \ or \\ or even \" etc '", "value=the value"]}

我在做

var jstring = <?php sanitize_json(json_encode($source_array)); ?>

JSON.parse(jstring);

我的 sanitize_json 函数目前正在执行反斜杠替换并且正在工作,但是我想包含换行符 \r\n。还需要确保js中的json没有其他此类问题。

【问题讨论】:

  • "我的问题是我在 php 中的 json 依赖于用户输入,我不知道他们会放什么。"用户的任何输入都应在处理之前进行清理。
  • 您能否再解释一下这个问题?抱歉,但我无法掌握您的第一个字符串在哪里出错 - 它产生了有效的对象(在 JS 中)。您是否允许用户制作他们的 JSON,然后将其保存到 DB,然后您想通过 JSON.parse 将其转换为 JS 对象?

标签: javascript php regex json backslash


【解决方案1】:

如果您看到json_encode()documentation,您会看到可以设置各种标志来清理数据。在您的情况下,JSON_UNESCAPED_SLASHES 可能会成功:

json_encode($data, JSON_UNESCAPED_SLASHES);

【讨论】:

  • 斜杠(您的建议)不是反斜杠(问题中的主要组成部分)。
  • 我可能错了,但是在我提到的json常量的上下文中,我的印象是反斜杠确实是斜杠
  • 引用 JSON 常量页面:"JSON_UNESCAPED_SLASHES (integer) Don't escape /. Available since PHP 5.4.0." 这没有提到或包括反斜杠 "\"
  • Acutally 这工作得很好,但我正在开发一个针对 PHP 5.2 以后的插件。如果是 PHP 5.4 以后的版本,这将是公认的答案。
  • 在这种情况下,您可能需要编写一个模仿JSON_UNESCAPED_SLASHES 操作的函数,并确保每次编码时都调用它。祝你的项目好运。
【解决方案2】:

你如何将你的 Json 字符串输入到JSON.parse

我只是通过执行以下 javascript 代码遇到了您的问题:

JSON.parse('["string\r\n next line \"quoted text\" and \b at path \/var\/opt "]');

但问题是:虽然 JSON 字符串是有效的,但它必须在作为 javascript 字符串一部分的上下文中进行转义。 JSON 字符串中的每个反斜杠实际上都是 javascript 字符串的一部分 - 包含“\n”的 javascript 字符串会将其转换为换行符。所以写入内存的数据不是你在源代码中看到的文本。

var x = '["string\\r\\n next line \\"quoted text\\" and \\b at path \\/var\\/opt "]';
alert(x); // should show the original JSON string
JSON.parse(x); // should work perfect then

所以您的问题刚刚从“如何在 PHP 中创建有效的 JSON 字符串”转换为“如何正确地将正确创建的 JSON 字符串(PHP 中 json_encode() 的结果)放入我的 Javascript 代码中?”

我们需要您在这里提供更多详细信息,因为我想说直接从 JSON 创建变量应该可以工作:

var x = ["string\r\n next line \"quoted text\" and \b at path \/var\/opt "];

而不是

var x = JSON.parse('["string\r\n next line \"quoted text\" and \b at path \/var\/opt "]');

【讨论】:

  • 我最好的猜测是 OP 可能正在使用 JSON.parse 来确定输入的 JSON 字符串是否正确(另一方面,他可以使用 json_decode 来做到这一点)。总的来说 - 写得很好。
猜你喜欢
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多