20

I am unable to handle JSON decode errors. Here is my code:

try {
    $jsonData = file_get_contents($filePath) . ']';
    $jsonObj  = json_decode($jsonData, true);
}
catch (Exception $e) {
    echo '{"result":"FALSE","message":"Caught exception: ' . $e->getMessage() . ' ~' . $filePath . '"}';
}

I am a new PHP programmer. Sorry, if something is wrong.

David Refoua
  • 2,879
  • 1
  • 26
  • 48
vineet
  • 10,659
  • 9
  • 50
  • 69
  • See here: http://stackoverflow.com/questions/12265830/can-json-encode-trigger-a-catch-block – Gaurav Dave Jul 23 '15 at 05:51
  • 1
    possible duplicate of [Detect bad json data in PHP json\_decode()?](http://stackoverflow.com/questions/2348152/detect-bad-json-data-in-php-json-decode) – num8er Jul 23 '15 at 05:53

4 Answers4

28

Another way to handle json decode error:-

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

May be you can try, validating json_decode

try {
  $jsonData = file_get_contents($filePath) . ']';
  $jsonObj  = json_decode($jsonData, true);

  if (is_null($jsonObj)) {
    throw ('Error');
  }
} catch (Exception $e) {
  echo '{"result":"FALSE","message":"Caught exception: ' . 
    $e->getMessage() . ' ~' . $filePath . '"}';
}

Read this too

b00t
  • 391
  • 2
  • 10
Dimag Kharab
  • 4,218
  • 1
  • 18
  • 41
  • 4
    Why call `is_null()` when you can just check if `$jsonObj === null`? – reformed Aug 18 '17 at 13:52
  • There is no difference between comparing is_null() and === null. I would say its just a preference. Check this one https://stackoverflow.com/questions/8228837/is-nullx-vs-x-null-in-php for more information. – Milen Gardev Apr 28 '20 at 17:13
6

Since PHP 7.3 one can use the JSON_THROW_ON_ERROR constant.

try {
    $jsonObj = json_decode($jsonData, true, $depth=512, JSON_THROW_ON_ERROR);
} catch (Exception $e) {
    // handle exception
}

More: https://www.php.net/manual/de/function.json-decode.php#refsect1-function.json-decode-changelog

Qrzysio
  • 986
  • 2
  • 9
  • 20
sergej
  • 373
  • 1
  • 5
  • 6
5

json_decode returns null when a error occurs, like no valid json or exceeded depth size. So basically you just check with if whether the jsondata you obtained is null or not. If it is, use json_last_error to see what went wrong, if not then continue with the script.

$json_data = json_decode($source, true);

if($json_data == null){
  echo json_last_error() . "<br>";
  echo $source; // good to check what the source was, to see where it went wrong
}else{
  //continue with script
}

Something like that should work.

Verkade89
  • 365
  • 2
  • 12