json_decode返回JSON_ERROR_SYNTAX,但在线格式化程序说JSON是可以的如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我有一个很奇怪的问题。

我有一个JSON web服务。

当我检查它与这个网站http://www.freeformatter.com/json-formatter.html#ad-output

一切都好。

但是当我用这个代码加载我的JSON时:

  $data = file_get_contents('http://www.mywebservice');

if(!empty($data))
{

    $obj = json_decode($data);

 switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo ' - JSON_ERROR_NONE';
    break;
    case JSON_ERROR_DEPTH:
        echo ' - JSON_ERROR_DEPTH';
    break;
    case JSON_ERROR_STATE_MISMATCH:
        echo ' - JSON_ERROR_STATE_MISMATCH';
    break;
    case JSON_ERROR_CTRL_CHAR:
        echo ' -  JSON_ERROR_CTRL_CHAR';
    break;
    case JSON_ERROR_SYNTAX:
        echo "\r\n\r\n - SYNTAX ERROR \r\n\r\n";
    break;
    case JSON_ERROR_UTF8:
        echo ' - JSON_ERROR_UTF8';
    break;
    default:
        echo ' - Unknown erro';
    break;
}

我得到了错误:SYNTAX ERROR

没有帮助全部。

这是一场噩梦。

我看到用PHP 5.5我可以使用这个函数:http : //php.net/manual/en/function.json-last-error-msg.php

(但我没有成功安装PHP 5.5,我不知道这个功能会给我更多的细节)

提问于
用户回答回答于

删除BOM(字节顺序标记)通常是需要的解决方案:

function removeBOM($data) {
    if (0 === strpos(bin2hex($data), 'efbbbf')) {
       return substr($data, 3);
    }
    return $data;
}

你不应该有一个BOM,但如果它在那里,它是不可见的,所以你不会看到它!

请参阅HTML中关于BOM的W3C

如果有很多文件需要修复,请使用BOM Cleaner

用户回答回答于

我面临同样的问题,实际上有一些隐藏的角色看不见,你需要删除它。以下是适用于多种情况的全局代码:

<?php
$checkLogin = file_get_contents("http://yourwebsite.com/JsonData");

// This will remove unwanted characters.
// Check http://www.php.net/chr for details
for ($i = 0; $i <= 31; ++$i) { 
    $checkLogin = str_replace(chr($i), "", $checkLogin); 
}
$checkLogin = str_replace(chr(127), "", $checkLogin);

// This is the most common part
// Some file begins with 'efbbbf' to mark the beginning of the file. (binary level)
// here we detect it and we remove it, basically it's the first 3 characters 
if (0 === strpos(bin2hex($checkLogin), 'efbbbf')) {
   $checkLogin = substr($checkLogin, 3);
}

$checkLogin = json_decode( $checkLogin );
print_r($checkLogin);
?>

扫码关注云+社区