JSON je úžasný datový formát (ve srovnání s příšerným XML), ale občas narazíte na obtížně odhalitelné problémy. Nemohl jsem přijít na to, co je s daty špatně. Asociovaný řetězec po dekódování JSON byl vždy null.
$data = json_decode($jsonString, true);
$data však byla null
JSON se zdál být v pořádku.
Co s tím?
1 2 3 4 5 |
$data = json_decode($jsonString, true); if (json_last_error() !== JSON_ERROR_NONE) { echo json_last_error_msg(); } var_dump($data); |
json_last_error_mgs() odhalil problém s kódováním znaků.
JSON musí být kódován v UTF-8. Tady byl zakopaný pes v mém případě.
Ale nastudoval jsem si díky tomu možnosti validace JSON formátu.
Expertní systém mi tuto problematiku vysvětlil následovně:
- Neplatný formát JSON: Nejčastějším důvodem, proč
json_decode
vracínull
, je to, že$jsonString
není správně naformátován jako platný JSON. To může zahrnovat syntaktické chyby, jako jsou chybějící uvozovky, přebytečné čárky, nesprávné použití hranatých nebo složených závorek atd. - Problémy s kódováním: Řetězec JSON musí být kódován v UTF-8. Pokud není,
json_decode
může selhat. To je obzvláště důležité, pokud řetězec JSON obsahuje speciální nebo ne-ASCII znaky. - Překročení limitu hloubky:
json_decode
má limit hloubky (standardně 512 úrovní). Pokud je váš JSON vnořený hlouběji než toto, funkce selže. - Velikost JSONu: Pokud je řetězec JSONu mimořádně velký, mohou nastat problémy s jeho zpracováním, v závislosti na prostředí a paměťových limitech.
Pro diagnostiku a řešení problému:
- Ověření JSONu: Použijte validátor JSON, jako je JSONLint, abyste zkontrolovali syntaxi. Zkopírujte a vložte svůj JSON řetězec do validátoru, abyste viděli, jestli nejsou žádné formátovací chyby.
- Kontrola kódování: Ujistěte se, že JSON je kódován v UTF-8, zvláště pokud obsahuje speciální znaky.
- Ladění v PHP: Použijte
json_last_error()
, abyste získali poslední chybu, která nastala během poslední operace kódování/dekódování JSON. - Velikost a hloubka: Pokud je JSON velmi velký nebo hluboce vnořený, zvažte zvýšení parametru hloubky v
json_decode($jsonString, true, $depth)
a ujistěte se, že vaše PHP prostředí má dostatečnou paměť.
Jak vlastně došlo k chybnému kódování?
Jednoduše.
Použil jsem
$jsonString = json_encode($data);
což je špatně.
Správně je
$jsonString = json_encode($data, JSON_UNESCAPED_UNICODE); //UTF-8
a také si musíte pohlídat, aby textová pole obsahovala escapovaný Enter (znak new line), tzn. namísto \n tam musí být \\n. Vlastně je tam potřeba dát \ celkem třikrát, aby v databázi byl jedenkrát, tzn. \\\n při ukládání a zůstane tam \n.