样例代码:
<?php $json = "['foo', 'bar']"; var_dump( json_decode($json) );
它适用于 PHP 5.5.3, 但对于较低版本的PHP则失败
它可以在我的装有PHP 5.5.3的计算机上使用,但是在其他地方都无法使用。
我知道这是错误的JSON,但我的网络服务向我提供了带有'符号的JSON 和"
'
"
['foo', "bar", {'test': "crazy \"markup\""}]
沙盒
如何在PHP 5.3中使用撇号解析JSON数据? 显然,我要解析的原始JSON更复杂。
(我无法在生产服务器上升级PHP,也无法从Web服务获取正确的JSON)
这是此问题的替代解决方案:
function fixJSON($json) { $regex = <<<'REGEX' ~ "[^"\\]*(?:\\.|[^"\\]*)*" (*SKIP)(*F) | '([^'\\]*(?:\\.|[^'\\]*)*)' ~x REGEX; return preg_replace_callback($regex, function($matches) { return '"' . preg_replace('~\\\\.(*SKIP)(*F)|"~', '\\"', $matches[1]) . '"'; }, $json); }
在两个方面,此方法比h2ooooooo的功能更健壮:
\"
测试:
$brokenJSON = <<<'JSON' ['foo', {"bar": "hel'lo", "foo": 'ba"r ba\"z', "baz": "wor\"ld ' test"}] JSON; $fixedJSON = fixJSON($brokenJSON); $decoded = json_decode($fixedJSON); var_dump($fixedJSON); print_r($decoded);
输出:
string(74) "["foo", {"bar": "hel'lo", "foo": "ba\"r ba\"z", "baz": "wor\"ld ' test"}]" Array ( [0] => foo [1] => stdClass Object ( [bar] => hel'lo [foo] => ba"r ba"z [baz] => wor"ld ' test ) )