3

我为一个朋友的 wordpress 网站编写了一个 API,它依赖 JSON API 插件来获取她最近帖子的 JSON 提要。它运行了几个月完美无缺,但几天前,当她的共享主机切换到 PHP 5.3 时,它完全停止运行(当然,他们没有提醒他们的用户——他们为什么要提醒他们?)

我四处寻找,在接受 JSON 字符串并将解码的 JSON 对象返回给另一个函数的代码部分中发现了一个奇怪的错误。以前,代码(有效,我发誓!)是这样工作的:

    $json_string = file_get_contents($url_to_json_string);
    return json_decode($json_string);

这开始返回 NULL,而 json_last_error 为 4(语法错误。)我检查了 utf8_encoding: 很好。我检查了 BOM 奇怪性(根据这篇文章):很好。我在jsonlint.comjson.parser.online.fr中验证了 JSON 字符串,它完全有效。没有杂散的实体,没有游荡的斜线。JSON 字符串本身很好,应该已经过验证。

然后,我将代码更改为:

    $json_string = file_get_contents($url_to_json_string);
    $json_object = json_decode($json_string);
    return $json_object;

它奏效了。

有谁知道为什么会这样?

4

3 回答 3

4

不可打印的字符必须是 JSON 字符串。下面使用:

json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string);, true );
于 2012-07-16T06:42:33.837 回答
3

这些链接可能适用:

PS:

我刚刚通过几个验证器运行了您的代码段:我没有发现任何问题......但您可能会:

于 2012-06-29T19:31:40.720 回答
0

jsonDecode 中存在一般错误,其中 "id":"google:1111111111111111111111111" 被翻译为 "id:"google:"11111111111111111111111111"" 导致语法错误。

要修复它,该行必须是: $json_without_bigints = preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input);

(它必须是:在前面的正则表达式中)。

于 2015-10-29T08:59:54.173 回答