关键要分清两个场景:一是用strlen()测原始json字符串的字节长度(如传输限制),需先清洗bom;二是先json_decode()并校验json_last_error(),再按类型判断解析后结构的实际元素个数,避免将解析失败的null误判为空数据。

PHP 7.4 中判断 JSON 相关字符串长度,关键要分清两个场景:一是测原始 JSON 字符串的字节长度(比如做传输限制、日志截断),二是测解析后数据结构的实际元素个数(比如判断有没有内容)。两者目的不同、方法不同,混用会出错。
测原始 JSON 字符串的字节长度用 strlen()
如果你关心的是这个 JSON 文本占多少存储空间或是否超 HTTP body 限制,就该用 strlen()——它返回的是字节数,和服务器、网络协议实际处理的单位一致。
- 直接对 JSON 字符串调用:
strlen($json),但前提是 $json 确实是字符串类型 - 读文件得到的 JSON 可能含 UTF-8 BOM(
\xEF\xBB\xBF),导致长度多出 3 字节,建议先清洗:strlen(ltrim($json, "\xEF\xBB\xBF")) - 不要用
mb_strlen($json, 'UTF-8')替代——它返回字符数,对 API 限长、数据库字段字节限制等场景无效 - 确保输入不是已解析的对象或数组,否则
strlen([])会警告并返回 false
测解析后 JSON 数据的“内容长度”必须先解码再判断
想确认 JSON 里有没有实质数据(比如是不是空数组 [] 或空对象 {}),不能对原始字符串用 count() 或 empty(),必须先 json_decode(),且务必检查解析是否成功。
- 先解码并验证:
$data = json_decode($json, true); if (json_last_error() !== JSON_ERROR_NONE) { /* 解析失败 */ } - 解析成功后,再区分类型判断:
- 空数组:
is_array($data) && $data === [] - 空对象:
is_object($data) && get_object_vars($data) === [](或统一用json_decode($json, true)转成数组,避免对象处理差异) - 数字、布尔、null 等合法 JSON 值,解析后不是数组/对象,
count()不适用,需按业务逻辑单独处理
- 空数组:
- 注意:
count(null)静默返回 0,empty(null)返回 true,但它们都可能是解析失败的结果,不能当作“空数据”直接使用
判断一个字符串是否为合法 JSON(前置校验)
在测长度前,若不确定输入是否真是 JSON,应先做合法性判断,避免后续操作基于错误数据:
- 排除空或纯空白:
if (!is_string($json) || trim($json) === '') { return false; } - 调用
json_decode($json, true)并检查错误:json_last_error() === JSON_ERROR_NONE - 不要用
is_array(json_decode($json))这类方式反推——"null"、"42"、"true"都是合法 JSON,但解码后都不是数组
中文或 emoji 字符串长度校验(用户输入场景)
如果 JSON 字段值本身是用户填写的中文文本(如 {"title": "你好世界"}),且你需要校验“标题不能超过 10 个汉字”,那就不是测 JSON 字符串长度,而是测其中某个字段的语义长度:
- 先解析:
$data = json_decode($json, true); - 再取字段并用
mb_strlen($data['title'] ?? '', 'UTF-8')判断字符数 - 确保 PHP 启用了
mbstring扩展,且编码显式指定为'UTF-8',避免依赖内部默认编码 - 前端 JS 校验建议用
Array.from(value).length,与后端保持一致
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











