在 PHP 7.4 中,json_decode 解码失败(返回 JSON 解码时最后发生的错误,不等于没有错误发生)的分析
1、当 basename: “collections” 时,解码成功。如图1
2、当 basename: “collectiontitem” 时,解码失败。如图2
3、查看 解码 的代码实现
$result = json_decode($data, true); if (json_last_error() !== \JSON_ERROR_NONE) { $message = "Invalid json: $data".PHP_EOL; if (function_exists('json_last_error_msg')) { $message .= ': ' . json_last_error_msg(); } throw new \RuntimeException($message); }
4、先分析成功的流程,打印 json_last_error()
//var_dump($data); $result = json_decode($data, true); //var_dump($result); var_dump(json_last_error()); if (json_last_error() !== \JSON_ERROR_NONE) { //dd(json_last_error()); $message = "Invalid json: $data".PHP_EOL; if (function_exists('json_last_error_msg')) { $message .= ': ' . json_last_error_msg(); } throw new \RuntimeException($message); }
int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0)
5、再分析失败的流程,打印 json_last_error(),其中一次失败的值等于 4。如图3
int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(0) int(4)
6、打印当值为 4 时的 $data、$result
//var_dump($data); $result = json_decode($data, true); //var_dump($result); //var_dump(json_last_error()); //exit; if (json_last_error() !== \JSON_ERROR_NONE) { var_dump($data); var_dump($result); var_dump(json_last_error()); exit; //dd(json_last_error()); $message = "Invalid json: $data".PHP_EOL; if (function_exists('json_last_error_msg')) { $message .= ': ' . json_last_error_msg(); } throw new \RuntimeException($message); }
string(872) " { "sections": { "collection": { "type": "collection", "settings": { "slug": "{{ $CollectionsSlug }}", "page": {{ Request::query('page') ?? '1' }} } }, "carousel": { "type": "carousel", "settings": { "color_scheme": "inverse", "loop": true, "autoplay": true, "interval": 10, "slidesPerView": 6 }, "blocks": { "slide-1": { "type": "slide", "settings": { "image": "https://cdn.cloudfastin.com/assets/2021/06/4fdfbe61604c5abe7e07746042e532b1.jpg" } }, "slide-2": { "type": "slide", "settings": { "image": "https://cdn.cloudfastin.com/assets/2021/06/45077c55aa09821c24aa1610ff7d3830.jpg" } } } } } } " NULL int(4)
7、当删除 “page”: {{ Request::query(‘page’) ?? ‘1’ }} 后,解析成功。最终分析得出原因在于 JSON_ERROR_SYNTAX 语法错误。如图4
if (json_last_error() === \JSON_ERROR_SYNTAX) { echo 'JSON_ERROR_SYNTAX'; }
8、编辑 $data,需要将 “page”: {{ Request::query(‘page’) ?? ‘1’ }} 替换为 “”page”: {{ Request::query(‘page’) ?? ‘1’ }}”。但是,page 的值类型为 int ,现在这样已经变化为了 string 类型。最为根本的解决方案应该是想办法运行程序,将其变化为 “page”: 1 才是。如图5
$result = json_decode($data, true); var_dump($data); var_dump($result); var_dump(json_last_error()); if (json_last_error() !== \JSON_ERROR_NONE) { $message = "Invalid json: $data".PHP_EOL; if (function_exists('json_last_error_msg')) { $message .= ': ' . json_last_error_msg(); } throw new \RuntimeException($message); }
string(838) " { "sections": { "collection": { "type": "collection", "settings": { "slug": "{{ $CollectionsSlug }}", "page": "{{ Request::query('page') ?? '1' }}" } }, "carousel": { "type": "carousel", "settings": { "color_scheme": "inverse", "loop": true, "autoplay": true, "interval": 10, "slidesPerView": 6 }, "blocks": { "slide-1": { "type": "slide", "settings": { "image": "https://cdn.cloudfastin.com/assets/2021/06/4fdfbe61604c5abe7e07746042e532b1.jpg" } }, "slide-2": { "type": "slide", "settings": { "image": "https://cdn.cloudfastin.com/assets/2021/06/45077c55aa09821c24aa1610ff7d3830.jpg" } } } } } } " array(1) { ["sections"]=> array(2) { ["collection"]=> array(2) { ["type"]=> string(10) "collection" ["settings"]=> array(2) { ["slug"]=> string(22) "{{ $CollectionsSlug }}" ["page"]=> string(35) "{{ Request::query('page') ?? '1' }}" } } ["carousel"]=> array(3) { ["type"]=> string(8) "carousel" ["settings"]=> array(5) { ["color_scheme"]=> string(7) "inverse" ["loop"]=> bool(true) ["autoplay"]=> bool(true) ["interval"]=> int(10) ["slidesPerView"]=> int(6) } ["blocks"]=> array(2) { ["slide-1"]=> array(2) { ["type"]=> string(5) "slide" ["settings"]=> array(1) { ["image"]=> string(79) "https://cdn.cloudfastin.com/assets/2021/06/4fdfbe61604c5abe7e07746042e532b1.jpg" } } ["slide-2"]=> array(2) { ["type"]=> string(5) "slide" ["settings"]=> array(1) { ["image"]=> string(79) "https://cdn.cloudfastin.com/assets/2021/06/45077c55aa09821c24aa1610ff7d3830.jpg" } } } } } } int(0)
近期评论