PHP 5.3是否存在有关json_decode返回NULL的bug,即使是对有效的JSON字符串?

3
我为朋友的WordPress网站编写了一个API,该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:正常。根据this post的建议,我检查了BOM-strangeness:正常。我在jsonlint.comjson.parser.online.fr中验证了JSON字符串,发现它完全有效。没有杂乱的html实体,也没有漫游的反斜杠。JSON字符串本身很好,应该已经验证过了。
然后,我将代码更改为以下内容:
    $json_string = file_get_contents($url_to_json_string);
    $json_object = json_decode($json_string);
    return $json_object;

它起作用了。

有人知道为什么会发生这种情况吗?


你能提供无法解析的JSON吗? - Sergey Eremin
可能只是更改配置文件,不允许从fopen打开URL。请检查phpinfo。 - MetalFrog
@MetalFrog 我一开始也以为那是错误。但是配置确实允许 allow_url_open。 - Harlo Holmes
@HarloHolmes 哦,如果是这样就太好了!我讨厌事情(看起来)突然坏掉的感觉。 - MetalFrog
json_decodejson_last_error()为4(很可能是JSON_ERROR_SYNTAX)告诉您这不是有效的json。所以我认为这只是关于适当的错误处理。您是否熟悉防御性编程的概念? - hakre
显示剩余4条评论
3个回答

4
非打印字符必须在 JSON 字符串中。请使用以下内容:
json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string);, true );

你有不必要的分号,正确的语法是 "json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string), true )"。 - Ivan Hanák

3

感谢@paulsm4提供的functions-online链接,我之前不知道这个网站!但你和我都是正确的,验证器也是正确的:问题似乎不在于JSON字符串本身。一旦我再次让它工作起来,就没有必要使用正则表达式或其他任何方式重新格式化字符串了。所以我仍然感到困惑! - Harlo Holmes

0

jsonDecode存在一个常见的错误,即将"id":"google:1111111111111111111111111111111111111"翻译为"id:"google:"11111111111111111111111111"",导致语法错误。

要修复它,必须使用以下行:

$json_without_bigints = preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input);

(正则表达式中前面必须是冒号)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接