在 PHP json_decode() 中检测错误的 json 数据?

2022-08-30 09:42:29

我正在尝试在通过json_decode()解析时处理错误的json数据。我使用以下脚本:

if(!json_decode($_POST)) {
  echo "bad json data!";
  exit;
}

如果 $_POST 等于:

'{ bar: "baz" }'

然后json_decode很好地处理错误并吐出“错误的json数据!但是,如果我将$_POST设置为“无效数据”之类的东西,它会给我:

Warning: json_decode() expects parameter 1 to be string, array given in C:\server\www\myserver.dev\public_html\rivrUI\public_home\index.php  on line 6
bad json data!

我是否需要编写自定义脚本来检测有效的 json 数据,或者是否有其他一些漂亮的方法来检测此数据?


答案 1

以下是关于json_decode的几件事:

  • 它返回数据,或者当有错误时null
  • 它也可以在没有错误时返回:当JSON字符串包含nullnull
  • 它会在有警告的地方发出警告 - 警告你想让消失。


为了解决警告问题,解决方案是使用@运算符(我通常不建议使用它,因为它使调试更加困难......但在这里,没有太多的选择):

$_POST = array(
    'bad data'
);
$data = @json_decode($_POST);

然后,您必须测试是否为 - 并且,为了避免在JSON字符串中返回的情况,您可以检查json_last_error,其中(引用)$datanulljson_decodenullnull

返回上次 JSON 分析发生的最后一个错误(如果有)。


这意味着您必须使用如下所示的一些代码:

if ($data === null
    && json_last_error() !== JSON_ERROR_NONE) {
    echo "incorrect data";
}

答案 2

从 PHP 7.3 开始,json_decode 函数将接受一个新的 JSON_THROW_ON_ERROR 选项,该选项将允许json_decode引发异常,而不是在出错时返回 null。


例:

try {  
  json_decode("{", false, 512, JSON_THROW_ON_ERROR);  
}  
catch (\JsonException $exception) {  
  echo $exception->getMessage(); // displays "Syntax error"  
}

推荐