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

如何处理json字符串php中的反斜杠,php,json,Php,Json,在尝试解码由json_encode生成的字符串时,json_encode和/或json_decode似乎有一个奇怪之处: $object = new stdClass; $object->namespace = 'myCompany\package\subpackage'; $jsonEncodedString = json_encode($object); echo $jsonEncodedString; // Result of echo be

在尝试解码由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的内置组件进行编码/解码。然而,如果我试图解码这个编码器产生的字符串,我会得到一条错误消息。我在文档中读过像“”这样的项目和其他像“”这样的堆栈问题。但我似乎找不到无法解码json_encode生成的字符串的原因。我用来测试这段代码的PHP版本是5.5.9


我知道我可能会因为遗漏了一些东西而完全不知所措,但如果我尝试在其他地方使用json_编码,我是否应该以不同的方式处理由json_编码生成的字符串?

这是因为PHP正在将双斜杠转换为单斜杠,然后再将其传递给json_解码。您需要避开双斜杠(我知道这很痛苦),或者手动构造对象

您只需使用该功能去除破折号,它就可以正常工作


您需要将双反斜杠编码为四个反斜杠,因为php将反斜杠解释为单引号和双引号字符串中的转义字符。这意味着
\
被视为
\

这个例子说明了正在发生的事情

<?php
$str = '{"namespace":"myCompany\\package\\subpackage"}';
echo $str, PHP_EOL; // \\ seen as \
$yetAnotherObject = json_decode($str);
echo json_last_error_msg(), PHP_EOL;

var_dump(json_decode(str_replace('\\', '\\\\', $str)));
echo json_last_error_msg(), PHP_EOL;

问题的答案是:

$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\u decode()
的字符串为

{"namespace":"myCompany\\package\\subpackage"}
请注意,这是运行时处理的字符的精确列表,而不是PHP或任何其他语言中表示的字符串。这些语言有表示特殊字符的特殊规则。这只是纯文本

上面的文本由函数
json\u decode()
解释,该函数期望它是一段
json
JSON
是一种小型语言,它对字符串中的特殊字符有特殊的编码规则。反斜杠是这些字符中的一个,当它出现在字符串中时,必须在前面加上另一个反斜杠
JSON
是不宽容的;当遇到反斜杠时,它总是将其视为字符串中下一个字符的转义字符

json\u decode()
在成功解析您传递给它们的json表示后创建的对象包含一个名为
namespace
的属性,其值为:

myCompany\package\subpackage
请再次注意,这是实际的字符串,而不是任何语言中的表示形式

出了什么问题? 回到您的代码:

$yetAnotherObject = json_decode('{"namespace":"myCompany\\package\\subpackage"}');
PHP解析器使用PHP规则解释上述代码。它理解调用
json\u decode()
函数时必须使用文本
{“namespace”:“myCompany\package\subpackage”}
作为参数


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

请使用PHP本机函数
stripslashes


为了清楚起见,建议在字符串上加一个str_replace(),然后在我试图解码的字符串上再加一个反斜杠?看起来有点僵硬。是的,这是一个奇怪的解决办法,但这是最简单的方法。str\u replace(“\\”、“\\\”、$input);这看起来真的很奇怪,因为在我清理输入之后,我现在必须检查每个字符串是否有反斜杠,并进行替换。似乎这不应该在编程级别上处理,而应该在语言级别上处理。我今天学到了一些东西,谢谢布莱克!PHP不转换任何东西。您将语言用于表示字符串中特殊字符的约定与解析器在运行时按照约定生成的字符序列相混淆
\`是告诉PHP解析器您希望字符串中有一个
`的方法。如果您使用stripslashes(),那么您正在将对象中的数据更改为:{“命名空间”:“MyCompanyPackageSubPackages”},这是一个不同的值。与文档一样:“返回一个去掉反斜杠的字符串。\'Been'等等。)双反斜杠(\)所以在这种情况下,它只会去掉两个斜杠中的一个,但这不是预期的结果。如果我想在javascript中直接使用PHP中的
json_encode
,比如
json.parse(“$encoded”),该怎么办
那么它将不起作用。生成的字符串是完全有效的JavaScript数据定义。(HTML+PHP)的一个片段如下:
let x=通用电气
myCompany\package\subpackage
$yetAnotherObject = json_decode('{"namespace":"myCompany\\package\\subpackage"}');
<?php
$str = 'myCompany\\package\\subpackage';
echo stripslashes(json_encode($str));
//output: myCompany\package\subpackage