Ce face json_last_error / json_last_error_msg
json_decode returnează null și pentru JSON invalid, și pentru textul valid "null". Ca să știi sigur dacă a fost o eroare, verifici json_last_error(): JSON_ERROR_NONE (0) înseamnă că totul a mers.
json_last_error_msg() returnează descrierea erorii, în engleză, de exemplu "Syntax error" sau "Malformed UTF-8 characters, possibly incorrectly encoded". Ambele funcții se referă doar la ultimul apel JSON.
Alternativa modernă este opțiunea JSON_THROW_ON_ERROR, care aruncă o excepție JsonException în loc să lase eroarea în această stare globală.
Ce returnează
Codul erorii (JSON_ERROR_NONE, JSON_ERROR_SYNTAX, JSON_ERROR_UTF8, JSON_ERROR_DEPTH etc.). json_last_error_msg returnează textul erorii.
Exemple
Exemplul 1: Verificarea după json_decode
<?php
$date = json_decode("{nume: Ana}", true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "Eroare " . json_last_error() . ": " . json_last_error_msg() . "\n";
}
json_decode('{"nume": "Ana"}', true);
echo json_last_error_msg();
Rezultat
Eroare 4: Syntax error
No error
Exemplul 2: null valid sau eroare?
<?php
foreach (["null", "nul"] as $json) {
$rezultat = json_decode($json);
echo var_export($rezultat, true) . " => " . json_last_error_msg() . "\n";
}
Rezultat
NULL => No error
NULL => Syntax error
Exemplul 3: Text cu codare greșită la json_encode
<?php
$text = "Ia\xC8"; // un caracter UTF-8 tăiat la jumătate
var_dump(json_encode(["oras" => $text]));
echo json_last_error_msg();
Rezultat
bool(false)
Malformed UTF-8 characters, possibly incorrectly encoded
Greșeli frecvente
- Verifici eroarea după alt apel JSON. Fiecare apel
json_encode/json_decoderesetează starea, deci verifică imediat după apelul care te interesează. - Verifici doar
$date === null. Textul JSON"null"este valid și dă totnull.
Comenzi înrudite
json_decode: Transformă un text JSON în tablou sau obiect PHP.json_encode: Transformă un tablou sau obiect PHP în text JSON.json_validate: Verifică dacă un text este JSON valid, fără să îl decodeze. Mai rapidă și cu memorie mai puțină decât json_decode.