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?

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ě:

  1. 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.
  2. 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.
  3. 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.
  4. 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.