gpt4 book ai didi

javascript - 在 javascript 中使用 PHP 生成 JSON : issues with backslashes

转载 作者:行者123 更新时间:2023-11-28 19:43:46 26 4
gpt4 key购买 nike

我看到了一些相关的答案,其中 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 不存在其他此类问题。

最佳答案

如何将 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 "]');

关于javascript - 在 javascript 中使用 PHP 生成 JSON : issues with backslashes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24640282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com