当php中的jsone_decode但json数据实际上不包含任何语法错误时,会出现JSON语法错误

时间:2015-06-02 08:13:59

标签: php json wordpress

我想在wordpress中使用 JSON 来获取帖子详细信息。在我的插件中,以下是json_decode部分。但它返回null

$post_count = intval($instance['post_count']);
$eng_posts= @json_decode(file_get_contents("http://athavaneng.com/?page_id=206861&posts_per_page=".$post_count), true);
switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo ' - No errors';
    break;
    case JSON_ERROR_DEPTH:
        echo ' - Maximum stack depth exceeded';
    break;
    case JSON_ERROR_STATE_MISMATCH:
        echo ' - Underflow or the modes mismatch';
    break;
    case JSON_ERROR_CTRL_CHAR:
        echo ' - Unexpected control character found';
    break;
    case JSON_ERROR_SYNTAX:
        echo ' - Syntax error, malformed JSON';
    break;
    case JSON_ERROR_UTF8:
        echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
    break;
    default:
        echo ' - Unknown error';
    break;
}

在上面的代码中,我收到JSON_ERROR_SYNTAX错误。但实际上,当我在http://athavaneng.com/?page_id=206861上测试http://jsonlint.com网址的返回JSON数据时。它说“有效的JSON ”。

为什么?这有什么问题?

1 个答案:

答案 0 :(得分:1)

响应服务器在启动json输出之前发送3个奇怪的字符。通过这样做:

$var = file_get_contents("http://athavaneng.com/?page_id=206861&posts_per_page=1");

for($i=0; $i<10; $i++) {    
    echo $var[$i] . " : " . ord($var[$i]) . "<br />";    
}
你会得到这样的东西:

ï : 239
» : 187
¿ : 191
{ : 123
" : 34
1 : 49
" : 34
: : 58
{ : 123
" : 34

服务器不应打印前三个字符(239,187和191)。作为一种解决方法,您应该能够在剥离前三个字符后解析它。

我可以使用以下代码解析你的json,它开始在字符3处读取:

$var = file_get_contents("http://athavaneng.com/?page_id=206861&posts_per_page=1", false, NULL, 3);
var_export(json_decode($var));