当前位置: 首页 > 面试题库 >

如何处理json字符串php中的反斜杠

柴英光
2023-03-14
问题内容

尝试解码json_encode生成的字符串时,json_encode和/或json_decode似乎有些奇怪:

    $object = new stdClass;
    $object->namespace = 'myCompany\package\subpackage';

    $jsonEncodedString = json_encode($object);
    echo $jsonEncodedString;
    // Result of echo being:
    // {"namespace":"myCompany\\package\\subpackage"}

    $anotherObject = json_decode($jsonEncodedString);
    echo $anotherObject->namespace;
    // Result of echo being:
    // myCompany\package\subpackage


    $yetAnotherObject = json_decode('{"namespace":"myCompany\\package\\subpackage"}');
    // Result should be:
    // myCompany\package\subpackage
    // But returns an invalid string sequence error instead...
    echo json_last_error_msg();

在此之前,我从未遇到过问题,因为直到今天,我再也不需要捕获其中带有反斜杠的字符串。在查看上面的代码时,我可以使用PHP的内置组件进行编码/解码。但是,如果我尝试解码此编码器产生的字符串,则会收到错误消息。我已经阅读了诸如“
预定义常量 ”之类的文档项目以及诸如“
如何使用php删除json响应中的反斜杠(“
\”)之类的其他堆栈问题。但是我似乎找不到原因为什么无法解码json_encode生成的字符串。我用于测试此代码的PHP版本是5.5.9。

我知道丢失某些东西可能完全一无所知,但是如果我尝试在其他地方使用它,我是否应该以不同的方式处理json_encode生成的字符串?


问题答案:

答案在以下问题中:

$jsonEncodedString = json_encode($object);
echo $jsonEncodedString;
// Result of echo being:
// {"namespace":"myCompany\\package\\subpackage"}

您不必去除任何斜杠。反之。您必须将echo-ed文本表示为PHP源代码。

$yetAnotherObject = json_decode('{"namespace":"myCompany\\\\package\\\\subpackage"}');

反斜杠(\)是PHP和JSON中的特殊字符。两种语言都使用它来转义字符串中的特殊字符,并且为了在字符串中正确表示反斜杠,您必须在PHP和JSON中都给它加上另一个反斜杠。

让我们尝试在上面的字符串上完成PHP解析器的工作。在开放括号之后,它遇到一个用单引号引起来的字符串。在单引号字符串中需要转义两个特殊字符:撇号(')和反斜杠(\)。尽管撇号总是需要转义,但PHP解释器是宽容的,只要不引起混淆,就允许使用未转义的反斜杠。但是,单引号字符串内反斜杠的正确表示形式是\\

传递给函数的字符串json_decode()

{"namespace":"myCompany\\package\\subpackage"}

请注意,这是在运行时处理的字符的准确列表,而不是用PHP或任何其他语言表示的字符串。这些语言具有表示特殊字符的特殊规则。这只是纯文本。

上面的文字是通过函数解释的json_decode(),期望它是的一部分JSONJSON这是一种小语言,它对字符串中的特殊字符进行编码有特殊的规则。反斜杠是这些字符之一,当它出现在字符串中时,必须在其前面加上另一个反斜杠。JSON不宽容
当遇到反斜杠时,始终将其视为字符串中下一个字符的转义字符。

json_decode()在成功解析JSON表示形式后,您将它们传递给您创建的对象包含一个名为namespace的单个属性,其值为:

myCompany\package\subpackage

再次注意,这是实际的字符串,而不是任何语言的表示形式。

什么地方出了错?

返回您的代码:

$yetAnotherObject = json_decode('{"namespace":"myCompany\\package\\subpackage"}');

PHP解析器使用PHP规则解释上述代码。它了解json_decode()必须以文本{"namespace":"myCompany\package\subpackage"}作为参数来调用该函数。

json_decode()使用其规则并尝试将上面的文本解释为JSON表示形式。引号("myCompany告诉它"myCompany\package\subpackage"必须解析为字符串。之前的反斜杠package被解释为的转义字符,p\p不是JSON中字符串的有效转义序列。这就是为什么它拒绝继续并返回的原因NULL



 类似资料:
  • 问题内容: 这是我需要分割的字符串。 我尝试了这个 但是没有用。 如何拆分此字符串… 问题答案: 首先,你不能在有问题的地方输入字符串 这应该替换为 因为反斜杠也需要转义。 最后,你需要执行以下操作来拆分它们: 希望这可以帮助。

  • 问题内容: 我需要反斜杠才能成为字符串的一部分。我该怎么做? 问题答案: 当反斜杠不能转义字符串的终止引号或以其他方式创建有效的转义序列(用双引号引起来的字符串)时,这两种方法中的任一个都会产生一个反斜杠: 当转义下一个字符会导致解析错误(字符串的引号终止)或有效的转义序列(双引号的字符串)时,则需要转义反斜杠:

  • 问题内容: 我试图将字符串传递给json对象,并且它可以工作。但是json中有一些反斜杠和双引号!如何删除它们? 我正在使用c#。这是我的代码。 当我在控制器中返回此函数时,我得到的结果是这样的 “ {\”状态\“:\”成功\“}” 问题答案: 发生这种情况是因为您正在手动(以代码形式)将数据序列化为JSON,并且当您从控制器返回数据时,框架再次序列化了相同的东西,它已经是json格式的字符串了!

  • 我尝试了许多方法从已执行的(我不是指从输入)中获得单个反斜杠。 我可以将特殊字符作为tab、new line和许多其他字符,然后将它们转义为或或,但当非特殊字符在旁边时,我不能获得单个反斜杠。 我不想要这样的东西: 如果我尝试在0处获取字符,则得到而不是。

  • 我一直在试图弄清楚如何在字符串中删除一个特殊字符及其前面的字母。 让我们假设,有一个带有的字符串。在这种情况下,我们必须从字符串中删除字符。因此,结果将是。 有人能帮我找到有效的方法吗?

  • 所以,我在Node.js中使用multer,它给出了上传图像的反斜杠路径,但这不起作用,因为我需要将其转换为URL。 这是我得到的输出: 但是,我想用正斜杠替换图像前的反斜杠。 我试过这个: 但是,它只是去掉了反斜杠: 附:我知道这个网站上有这样的问题,但他们没有帮助我。例如,multer:文件的路径是不对的对我没有帮助,所以请不要将此标记为重复问题。多谢了。