【问题标题】:escaping json string with a forward slash?用正斜杠转义 json 字符串?
【发布时间】:2010-08-05 10:39:44
【问题描述】:

我在将 json 字符串传递回 php 脚本进行处理时遇到问题。

我有一个使用包含 / 的 dojo.toJson() 创建的 json 字符串,如下所示:

[{"id":"2","company":"My Company / Corporation","jobrole":"Consultant","jobtitle":"System Integration Engineer"}]

当我将字符串传递回 php 脚本时,它会在 / 处被截断并创建一个格式错误的 json 字符串,这意味着我无法将其转换为 php 数组。

在这个字符串中转义 / 的最佳方法是什么?我正在查看正则表达式并执行 string.replace() 但是我的正则表达式不是那么强大,我不确定是否有更好的方法来做到这一点?

非常感谢

【问题讨论】:

    标签: php javascript json dojo


    【解决方案1】:

    您不需要做任何特别的事情来在 JSON 中表示 / - 字符串可以包含除 " 或(当不用于启动转义序列时)\ 之外的任何字符。

    因此问题可能出在:

    • 解析 JSON 服务器端的方式
    • 解析 HTTP 数据以获取 JSON 字符串的方式
    • 在发出 HTTP 请求之前对字符串进行编码的方式

    (我敢打赌这是最后一个选项)。

    我会首先使用 LiveHttpHeaders 或 Charles Proxy 等工具来查看发送到服务器的确切数据。

    (我还将使用您用于发出请求的代码以及用于在另一端解析它的代码来扩展问题)。

    【讨论】:

    • HTTPFox 比 LiveHTTPHeaders 更有用 - 它捕获多个请求并以漂亮的表格格式显示组件,而不是 LHH 的文本转储。
    【解决方案2】:

    \/。看看here。该文档非常易于阅读,简洁明了。但是未转义的 / 在 JSON 的字符串中应该仍然有效,所以您的错误可能在其他地方?

    【讨论】:

    • 我现在所做的就是获取字符串并将其作为 GET 请求传递给 php 脚本,当使用调试器单步执行时,传递回的字符串与其余部分一起在“My Comany”处停止不见了。
    • 好的。 Kow 您是否将这个变量传递给 PHP 脚本(代码)?顺便说一句 - 将 JSON 传递给 PHP 毫无意义。从 PHP 到 JS - 好的,但除此之外它有点愚蠢。 JSON 基本上是 Javascript 对象,因此在 PHP 中您必须将其编码为 PHP,然后进行解析。更好地传递一系列 GET 变量 - PHP 原生处理它们。
    • @Tomasz — PHP 已经原生处理 JSON 有一段时间了(你只需要显式调用解析函数)
    • 是的,我知道,但这不是“本机”,而是“有工具”。 json_encode/decode 存在,但是......最好通过标准查询传递它,减少解析。在 json var 中,首先 php 库解析 URL 以将其“分发”到 $_GET vars,然后您必须另外从 JSON 对其进行编码......如果您有这样的选项,在 JS 端正确编码它会更容易。减少工作量,减少出错的地方。
    【解决方案3】:

    好的。无论如何。

    向 PHP 传递变量时,不要使用 JSON - 以其他方式传递变量很有用。

    相反,您最好使用http://api.dojotoolkit.org/jsdoc/1.3/dojo.objectToQuery 方法并在PHP 端解析标准PHP $_GET 变量。

    编辑:好的,我在这里也“迷失在树林中”,但这里有一个提示 - 检查你是否在这里没有一些 mod_rewrite 规则在起作用。有点像。

    另外,如果你能把给你 404 的 URL 发给我(你可以删掉域部分,我对脚本文件名和之后的所有内容感兴趣)也许我可以给你更详细的答案。

    【讨论】:

    • 我已经尝试过了,但是当我使用 firebug 查看对 php 脚本的调用时,我得到一个 404 错误,当我删除 / 时它是否正常?一定有其他影响这个,我正在做的,我会继续插上这个。
    • 另外,如果你能把给你 404 的 URL 发给我(你可以删掉域部分,我对脚本文件名和之后的所有内容感兴趣)也许我可以给你更详细的答案。
    【解决方案4】:

    需要明确的是,您是选择将 JSON 发送到 PHP 还是使用常规表单值是一个偏好问题。它/应该/以任何一种方式工作。听起来您没有在客户端对 JSON 进行 url 编码,因此服务器端将 / 视为路径分隔符。在这种情况下,它在 json_decode 到达它之前就很无聊。

    所以,试试 encodeURIComponent(dojo.toJson(stuff))

    【讨论】:

      【解决方案5】:

      json_encode() 用于转义正斜杠。像这样:

      prompt> json_encode(json_decode('"A/B"'));
      string(6) ""A\/B""
      

      在 PHP5.4 中添加了 JSON_UNESCAPED_SLASHES 来抑制这种行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-11
        • 1970-01-01
        • 2013-03-17
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多