PHP中如何验证JSON格式是否正确

来源:Android社区作者:BIT程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《PHP中如何验证JSON格式是否正确》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《PHP中如何验证JSON格式是否正确》有用,将其分享出去将是对创作者最好的鼓励。

在PHP开发中,处理JSON数据是常见需求,如果传入的JSON字符串格式不符合规范,后续调用json_decode解析时可能返回null,且无法直观判断是格式错误还是数据本身为null,因此提前验证JSON格式是否正确非常有必要。本文会介绍几种PHP中验证JSON格式的方法,开发者可以根据实际场景选择使用。

PHP中如何验证JSON格式是否正确

方法一:使用json_validate函数(PHP 8.3及以上版本)

PHP 8.3版本新增了json_validate内置函数,专门用于验证字符串是否为合法的JSON格式,使用起来非常简单,不需要进行解码操作,性能也比先解码再判断的方式更好。

函数语法如下:

<?php
/**
 * 验证JSON字符串是否合法
 * @param string $json 待验证的JSON字符串
 * @return bool 合法返回true,否则返回false
 */
function checkJsonWithValidate(string $json): bool {
    return json_validate($json);
}

// 测试示例
$validJson = '{"name":"test","age":20}';
$invalidJson = '{"name":"test",age:20}'; // 键没有加双引号,格式错误

var_dump(checkJsonWithValidate($validJson)); // 输出 bool(true)
var_dump(checkJsonWithValidate($invalidJson)); // 输出 bool(false)
?>

需要注意的是,json_validate函数仅验证JSON格式是否合法,不会检查JSON数据的深度或者递归限制,如果需要处理超长或者嵌套层级很深的JSON,还需要额外做限制。

方法二:使用json_decode配合json_last_error函数

如果使用的PHP版本低于8.3,没有json_validate函数,可以通过json_decode解析字符串,再结合json_last_error函数判断解析过程是否出现错误,以此验证JSON格式是否正确。

具体实现逻辑是:先调用json_decode尝试解析字符串,然后调用json_last_error获取错误码,如果错误码为JSON_ERROR_NONE,说明解析没有错误,JSON格式合法,否则格式不合法。

<?php
/**
 * 低版本PHP验证JSON格式的方法
 * @param string $json 待验证的JSON字符串
 * @return bool 合法返回true,否则返回false
 */
function checkJsonWithDecode(string $json): bool {
    // 尝试解析JSON,第二个参数true表示返回关联数组
    json_decode($json, true);
    // 获取最后一次JSON解析的错误码
    $errorCode = json_last_error();
    // 错误码为JSON_ERROR_NONE表示没有错误
    return $errorCode === JSON_ERROR_NONE;
}

// 测试示例
$validJson = '[{"id":1,"title":"测试"},{"id":2,"title":"示例"}]';
$invalidJson = '[{"id":1,"title":"测试"},]'; // 尾部多了一个逗号,格式错误

var_dump(checkJsonWithDecode($validJson)); // 输出 bool(true)
var_dump(checkJsonWithDecode($invalidJson)); // 输出 bool(false)
?>

这种方式的缺点是会实际执行JSON解码操作,如果JSON字符串很长,会消耗一定的内存和性能,而且如果JSON数据本身很大,解析失败后再处理错误也会稍显繁琐。

方法三:自定义正则验证(不推荐)

有些开发者会尝试用正则表达式验证JSON格式,但是JSON的语法规则比较复杂,嵌套结构、转义字符、各种数据类型(字符串、数字、布尔值、null、数组、对象)的组合很难用正则完全覆盖,很容易出现误判的情况,因此不推荐使用这种方式。

以下是一个简单的不完整正则示例,仅能验证非常基础的JSON对象,无法覆盖所有合法场景:

<?php
/**
 * 不推荐的正则验证JSON方法,仅作演示
 * @param string $json 待验证的JSON字符串
 * @return bool
 */
function checkJsonWithRegex(string $json): bool {
    // 仅能匹配简单的键值对JSON对象,无法处理数组、嵌套、转义等场景
    $pattern = '/^{"[^"]+":"[^"]+"}$/';
    return preg_match($pattern, $json) === 1;
}

$testJson = '{"name":"test"}';
var_dump(checkJsonWithRegex($testJson)); // 输出 int(1) 即匹配成功
$testJson2 = '{"name":"test","age":20}'; // 多个键值对就无法匹配
var_dump(checkJsonWithRegex($testJson2)); // 输出 int(0) 即匹配失败,但实际是合法JSON
?>

可以看到正则验证的局限性非常明显,实际开发中不要使用这种方式验证JSON格式。

不同方法的适用场景对比

可以通过以下表格快速了解不同验证方法的特点,选择适合自己项目的方案:

验证方法适用PHP版本性能准确性推荐程度
json_validate函数PHP 8.3及以上优先推荐
json_decode+json_last_error所有PHP版本低版本PHP推荐
自定义正则验证所有PHP版本不推荐

注意事项

  • 验证JSON格式前,建议先判断传入的参数是否为字符串类型,如果不是字符串,直接判定为不合法,避免函数调用报错。
  • json_validate函数默认只验证JSON格式,不会限制JSON的嵌套深度,如果需要处理用户输入的JSON,建议手动限制最大嵌套深度,避免恶意构造超深JSON导致程序性能问题。
  • 如果验证JSON是为了后续解析使用,PHP 8.3及以上版本可以先调用json_validate验证,通过后再调用json_decode解析,这样既能保证格式正确,又不会重复解析浪费性能。

总结

PHP中验证JSON格式最推荐的方式是使用PHP 8.3新增的json_validate函数,简单高效且准确性高;如果使用低版本PHP,可以选择json_decode配合json_last_error的方式实现验证;不要尝试用正则表达式验证JSON,很容易出现漏判或者误判的情况。开发者可以根据自己项目的PHP版本选择合适的验证方案,保障JSON数据处理的稳定性。

PHPJSONjson_validatejson_last_error格式验证修改时间:2026-06-20 14:36:18

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。