没有不值得去解决的问题,也没有不值得去学习的技术!

在 PHP 7.4 中,json_decode 解码失败(返回 JSON 解码时最后发生的错误,不等于没有错误发生)的分析

当 basename: "collectiontitem" 时,解码失败

作者:

, ,

1、当 basename: “collections” 时,解码成功。如图1

当 basename: "collections" 时,解码成功
图1

2、当 basename: “collectiontitem” 时,解码失败。如图2

当 basename: "collectiontitem" 时,解码失败
图2

3、查看 解码 的代码实现

PHP

        $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()

PHP

        //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);
        }

Plaintext

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

再分析失败的流程,打印 json_last_error(),其中一次失败的值等于 4
图3
Plaintext

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

PHP

        //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);
        }

Plaintext

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

当删除 "page": {{ Request::query('page') ?? '1' }} 后,解析成功。最终分析得出原因在于 JSON_ERROR_SYNTAX语法错误
图4
PHP

            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

编辑 $data,需要将 "page": {{ Request::query('page') ?? '1' }} 替换为 ""page": {{ Request::query('page') ?? '1' }}"。但是,page 的值类型为 int ,现在这样已经变化为了 string 类型。最为根本的解决方案应该是想办法运行程序,将其变化为 "page":  1 才是
图5
PHP

        $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);
        }

Plaintext

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)

需要长期技术维护或远程问题排查?

我是拥有 15+ 年经验的 PHP / Go 后端工程师,长期关注已有系统维护、Bug 修复、性能优化、服务器排查、WordPress 网站维护和小功能迭代。

如果你的项目遇到以下情况,可以先从一次小问题排查开始合作:

  • ✅ PHP / Laravel / Yii2 老项目无人维护
  • ✅ Go / Gin 后端接口需要排查或优化
  • ✅ WordPress 网站访问慢、报错或插件冲突
  • ✅ Nginx / MySQL / Redis / Linux 服务器异常
  • ✅ CDN / Cloudflare / DNS / HTTPS 配置问题
  • ✅ 需要长期远程技术支持或兼职维护

更多介绍请查看:关于我 & 合作

微信:13980074657
邮箱:shuijingwanwq@gmail.com
Telegram:@shuijingwan
GitHub:https://github.com/shuijingwan