在 PHP 7.4 中,json_decode 解码失败(返回 JSON 解码时最后发生的错误,不等于没有错误发生)的分析
1、当 basename: “collections” 时,解码成功。如图1
2、当 basename: “collectiontitem” 时,解码失败。如图2
3、查看 解码 的代码实现
1 2 3 4 5 6 7 8 9 10 11 | $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()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //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 ); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //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 ); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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": { } }, "slide-2": { "type": "slide", "settings": { } } } } } } " NULL int(4) |
7、当删除 “page”: {{ Request::query(‘page’) ?? ‘1’ }} 后,解析成功。最终分析得出原因在于 JSON_ERROR_SYNTAX 语法错误。如图4
1 2 3 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $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 ); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | 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": { } }, "slide-2": { "type": "slide", "settings": { } } } } } } " 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"]=> } } ["slide-2"]=> array(2) { ["type"]=> string(5) "slide" ["settings"]=> array(1) { ["image"]=> } } } } } } int(0) |
近期评论