如何处理json字符串php中的反斜杠
尝试解码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()
,期望它是的一部分JSON
。JSON
这是一种小语言,它对字符串中的特殊字符进行编码有特殊的规则。反斜杠是这些字符之一,当它出现在字符串中时,必须在其前面加上另一个反斜杠。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字符串php中的反斜杠 的全部内容, 来源链接: utcz.com/qa/427494.html