全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

php如何捕获解析json语法错误_phpjson_decode加标志与异常包装返回提示

使用json_last_error()和JSON_THROW_ON_ERROR可检测JSON解析错误,结合封装函数返回友好提示,提升调试效率。

PHP 中使用 json_decode() 解析 JSON 字符串时,如果内容存在语法错误(如引号不匹配、非法字符、格式错误等),函数不会抛出异常,而是返回 null。因此需要额外手段来检测和捕获这些错误。通过结合错误标志和封装处理逻辑,可以实现更友好的错误提示。

使用 json_last_error() 检查解析错误

PHP 提供了 json_last_error() 函数,用于获取最后一次 JSON 操作的错误状态。配合 json_decode() 使用,可判断是否解析成功:

  • JSON_ERROR_NONE:无错误
  • JSON_ERROR_DEPTH:超过最大堆栈深度
  • JSON_ERROR_STATE_MISMATCH:语法错误,如括号不匹配
  • JSON_ERROR_CTRL_CHAR:控制字符错误
  • JSON_ERROR_SYNTAX:语法错误
  • JSON_ERROR_UTF8:UTF-8 编码错误

示例代码:

function safeJsonDecode($jsonString) {
    $data = json_decode($jsonString, true);
    
    if (json_last_error() === JSON_ERROR_NONE) {
        return ['success' => true, 'data' => $data];
    }

    return [
        'success' => false,
        'error'   => json_last_error_msg(),
        'raw'     => $jsonString
    ];
}

添加 JSON_THROW_ON_ERROR 标志(PHP 7.3+)

从 PHP 7.3 开始,json_decode() 支持传入 JSON_THROW_ON_ERROR 标志,使函数在出错时抛出 JsonException 异常,便于用 try-catch 捕获:

try {
    $data = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR);
    echo "解析成功";
} catch (JsonException $e) {
    echo "JSON 解析失败: " . $e->getMessage();
}

封装通用解析函数返回友好提示

将上述方法整合,可创建一个健壮的 JSON 解析包装函数,兼顾兼容性和提示清晰度:

function parseJson($jsonString) {
    // 去除 BOM 或空白字符干扰
    $jsonString = trim($jsonString);
    if (substr($jsonString, 0, 3) === pack("CCC", 0xEF, 0xBB, 0xBF)) {
        $jsonString = substr($jsonString, 3);
    }

    if (PHP_VERSION_ID >= 70300) {
        try {
            $data = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR);
            return ['success' => true, 'data' => $data];
        } catch (JsonException $e) {
            return [
                'success' => false,
                'error'   => $e->getMessage(),
                'code'    => $e->getCode()
            ];
        }
    } else {
        $data = json_decode($jsonString, true);
        if (json_last_error() === JSON_ERROR_NONE) {
            return ['success' => true, 'data' => $data];
        }
        return [
            'success' => false,
            'error'   => json_last_error_msg(),
            'hint'    => '请检查 JSON 格式,如引号、逗号、括号是否正确'
        ];
    }
}

调用示例:

$result = parseJson('{"name": "张三", "age": }');
if (!$result['success']) {
    echo "错误提示:" . $result['error'];
}

基本上就这些。合理使用错误检测机制和异常处理,能让 JSON 解析更可靠,调试更高效。


# php  # js  # json  # 编码  #   # NULL  # 封装  # try  # catch  # 字符串  #   # 抛出  # 错误提示  # 不匹配  # 能让  # 可以实现  # 创建一个  # 是否正确  # 请检查  # 判断是否  # img 


相关文章: 东莞专业制作网站的公司,东莞大学生网的网址是什么?  如何用西部建站助手快速创建专业网站?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  广东企业建站网站优化与SEO营销核心策略指南  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  招贴海报怎么做,什么是海报招贴?  宝塔面板创建网站无法访问?如何快速排查修复?  如何在阿里云完成域名注册与建站?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  如何在搬瓦工VPS快速搭建网站?  制作门户网站的参考文献在哪,小说网站怎么建立?  怎么将XML数据可视化 D3.js加载XML  如何通过NAT技术实现内网高效建站?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  如何在宝塔面板中创建新站点?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  如何在宝塔面板中修改默认建站目录?  c++ stringstream用法详解_c++字符串与数字转换利器  如何续费美橙建站之星域名及服务?  济南专业网站制作公司,济南信息工程学校怎么样?  网站制作的步骤包括,正确网址格式怎么写?  常州自助建站工具推荐:低成本搭建与模板选择技巧  如何构建满足综合性能需求的优质建站方案?  三星网站视频制作教程下载,三星w23网页如何全屏?  建站之星如何实现五合一智能建站与营销推广?  c++怎么用jemalloc c++替换默认内存分配器【性能】  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何快速上传自定义模板至建站之星?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  Swift中swift中的switch 语句  如何快速搭建高效简练网站?  简单实现Android文件上传  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  电商平台网站制作流程,电商网站如何制作?  建站之星免费版是否永久可用?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何通过云梦建站系统实现SEO快速优化?  微信小程序 五星评分(包括半颗星评分)实例代码  建站之星如何实现PC+手机+微信网站五合一建站?  Python如何创建带属性的XML节点  定制建站策划方案_专业建站与网站建设方案一站式指南  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  建站三合一如何选?哪家性价比更高?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  广州营销型建站服务商推荐:技术优势与SEO优化解析  C++时间戳转换成日期时间的步骤和示例代码  高端网站建设与定制开发一站式解决方案 中企动力 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。