Hintergrund
Wenn Sie im aktuell stabilen PHP V7.2 feststellen möchten, dass der JSON ungültig ist, müssen Sie die Funktionsüberprüfung json_last_error() verwenden:
>>> json_decode("{"); => null >>> json_last_error(); => 4 >>> json_last_error() === JSON_ERROR_NONE => false >>> json_last_error_msg() => "Syntax error"
Hier ist zum Beispiel eine Prüfung in Larave, um sicherzustellen, dass der Aufruf der JSON-Kodierung nicht zu einem Fehler führt:
// Once we get the encrypted value we'll go ahead and base64_encode the input // vector and create the MAC for the encrypted value so we can then verify // its authenticity. Then, we'll JSON the data into the "payload" array. $json = json_encode(compact('iv', 'value', 'mac')); if (json_last_error() !== JSON_ERROR_NONE) { throw new EncryptException('Could not encrypt the data.'); } return base64_encode($json);
Wir können zumindest feststellen, ob ein Fehler in der JSON-Kodierung vorliegt /decoding, aber das ist im Vergleich zum Auslösen etwas umständlich. Eine Ausnahme gibt einen Fehlercode und eine Fehlermeldung aus.
Während Sie bereits Optionen zum Erfassen und Verarbeiten von JSON haben, wollen wir sehen, was die neue Version auf nette Weise leisten kann!
Auslösen von Fehlerflags in PHP 7.3
Mit dem neuen Optionsflag JSON_THROW_ON_ERROR ist es möglich, diesen Codeblock umzuschreiben, um Try/Catch zu verwenden.
Vielleicht so etwas:
use JsonException; try { $json = json_encode(compact('iv', 'value', 'mac'), JSON_THROW_ON_ERROR); return base64_encode($json); } catch (JsonException $e) { throw new EncryptException('Could not encrypt the data.', 0, $e); }
Ich denke, dieser neue Stil ist besonders nützlich für Benutzercode, wenn Sie JSON-Daten erhalten, anstatt nach json_last_error() zu suchen und Optionen für die JSON-Kodierung und -Dekodierung abzugleichen kann Fehlerhandler nutzen.
Diese json_decode()-Funktion benötigt ein paar Parameter und sieht aus wie PHP 7.3 und niedriger. Wenn Sie die Fehlerbehandlung nutzen möchten:
use JsonException; try { return json_decode($jsonString, $assoc = true, $depth = 512, JSON_THROW_ON_ERROR); } catch (JsonException $e) { // Handle the JSON Exception } // Or even just let it bubble up... /** * Decode a JSON string into an array * * @return array * @throws JsonException */ function decode($jsonString) { return json_decode($jsonString, $assoc = true, $depth = 512, JSON_THROW_ON_ERROR); }
Erhalten Sie den Fehlercode und den Fehler Nachricht
Zuvor haben Sie den JSON-Fehlercode und die JSON-Fehlermeldung mit der folgenden Funktion erhalten:
// Error code json_last_error(); // Human-friendly message json_last_error_msg();
Wenn Sie das neue JSON_THROW_ON_ERROR verwenden, erfahren Sie hier, wie Sie das verwenden Geben Sie den Code ein und erhalten Sie die Meldung:
try { return json_decode($jsonString, $assoc = true, $depth = 512, JSON_THROW_ON_ERROR); } catch (JsonException $e) { $e->getMessage(); // like json_last_error_msg() $e->getCode(); // like json_last_error() }