我正在尝试编写一个 php 脚本来处理来自以字符串形式提供“json”的 Web 服务的数据。问题是字符串并不是真正的 json;这是 JavaScript。具体来说,尽管变量被引用,但键未被引用。示例(实际数据更长且更复杂):
{desc:'User defined payload'}
正如所描述的PHP手册, json_decode() 正确地无法解释该字符串。
我的问题是,如何在 php 中成功解释这样的字符串?
我能想到的唯一解决方案是编写一些修复语法的正则表达式,但这样我就会遇到两个问题。
EDIT
Hadvig 使用 Services_JSON pear 模块的建议有效,并且看起来像是一个通用解决方案。安装模块后,我的代码如下所示:
require_once 'PEAR.php';
require_once 'Services/JSON.php';
$Services_JSON = new Services_JSON();
$data = $Services_JSON->decode($malformed_json);
不幸的是,这很慢。解释整个字符串(约 400,000 个字符)需要超过 36 秒!使用正则表达式修复引号,然后使用 json_decode 大约需要 0.04 秒。这是我使用的:
// fix single quotes
$s = str_replace("'", '"', $malformed_json);
// fix unquoted keys
$valid_json = preg_replace('/([{\[,])\s*([a-zA-Z0-9_]+?):/', '$1"$2":', $s);
$data = json_decode($valid_json);
当然,如果数据包含任何引号、括号或逗号,这就会中断。