【问题标题】:PHP json_decode JSON_ERROR_SYNTAXPHP json_decode JSON_ERROR_SYNTAX
【发布时间】:2017-09-21 18:47:23
【问题描述】:

我尝试从 link 加载和解析 JSON 文件

但我有JSON_ERROR_SYNTAX 的问题和为foreach() 提供的无效参数。为什么会这样?

[{ "Manufacturer": "Toyota", "Sold": 1200, "Month": "2012-11" }, { "Manufacturer": "Ford", "Sold": 1100, "Month": "2012-11" }, { "Manufacturer": "BMW", "Sold": 900, "Month": "2012-11" }, { "Manufacturer": "Benz", "Sold": 600, "Month": "2012-11" }, { "Manufacturer": "GMC", "Sold": 500, "Month": "2012-11" }, { "Manufacturer": "HUMMER", "Sold": 120, "Month": "2012-11" }]

<?php
$url = "http://www.pureexample.com/backend/data/car-sale.json";
$url = file_get_contents($url);
print_r($url);
$url = stripslashes($url);
print_r($url);
$url = str_replace("\n", "", $url);
print_r($url);
$url = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($url));
print_r($url);
$url = json_decode($url, true);
// Add this switch to your code
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;
}


foreach($koyim as $data){
echo $data['Manufacturer'];
echo $data['Sold'];
echo $data['Month'];
echo "<br/>";
}
?>

【问题讨论】:

  • 为什么在json_decode()之前使用stripslashes()str_replace()iconv()utf8_encode()
  • 网址(在您的转换之前)是有效的 json。你现在知道该去哪里看 :)
  • 如果你的 apache 服务器只服务一个网站,使用 json_last_error() 可能是有用的,但是如果你从其他网站生成的其他错误中得到错误,这个函数会触发最后一个错误最后一次调用函数 json_encode 或 json_decode。
  • json 在所有地方都无效!

标签: php json


【解决方案1】:

您提供的 link 提供带有字节顺序标记的 UTF-8 格式的 JSON。显然json_decode() 不能很好地处理这三个无关的字符。解决方案是剥离 BOM:

<?php

//see https://stackoverflow.com/a/32185872/500890
function removeBomUtf8($s){
   if(substr($s,0,3)==chr(hexdec('EF')).chr(hexdec('BB')).chr(hexdec('BF'))){
        return substr($s,3);
    }else{
        return $s;
    }
}

$url = "http://www.pureexample.com/backend/data/car-sale.json";
$content = file_get_contents($url);
$clean_content = removeBomUtf8($content);
$decoded = json_decode($clean_content);

//Recovered data
echo "<pre>" . print_r($decoded, TRUE);

我采用此解决方案来剥离 BOM:https://stackoverflow.com/a/32185872/500890,尽管 Internet 上流传着大量此类问题。主要思想是,如果前三个特定字符确实是 BOM,则去掉它们。

【讨论】:

  • 很好,当你发布它时,我正在使用测试脚本调试它,我看到与 OP 相同的行为。这确实解决了问题。很好的发现!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2011-05-03
  • 2018-01-30
相关资源
最近更新 更多