
当在foreach循环中对json_decode结果直接访问属性时出现“trying to get property of non-object”错误,通常是因为部分数组元素包含非json字符串(如空值、表头或无效json),导致json_decode返回null而非对象。
当在foreach循环中对json_decode结果直接访问属性时出现“trying to get property of non-object”错误,通常是因为部分数组元素包含非json字符串(如空值、表头或无效json),导致json_decode返回null而非对象。
在使用 PhpSpreadsheet 解析 Excel 并通过 json_decode() 提取嵌套 JSON 数据时,常见的陷阱是未校验解码结果的有效性。你遇到的现象——循环内报错而循环外能正常输出——恰恰揭示了问题本质:$data[2] 在不同行中内容不一致。
例如,Excel 第一行很可能是表头(如 "nome,telefone,email" 或纯文本 "Data"),它无法被 json_decode() 解析为合法 JSON,因此返回 null。此时执行 $x->nome 即触发 Trying to get property 'nome' of non-object 错误。
✅ 正确做法是:始终检查 json_decode() 的返回值,并跳过无效数据:
foreach ($data_array as $index => $data) {
// 确保索引 2 存在且非空
if (!isset($data[2]) || !is_string($data[2]) || trim($data[2]) === '') {
error_log("Row {$index}: Missing or empty JSON data at index 2");
continue;
}
// 解码并严格验证是否为对象
$x = json_decode($data[2]);
if (!is_object($x)) {
error_log("Row {$index}: Invalid JSON in column 2: " . var_export($data[2], true));
continue;
}
// 安全访问属性(建议配合 isset 防御)
echo isset($x->nome) ? htmlspecialchars($x->nome) : '[N/A]';
echo ' | ';
echo isset($x->telefone) ? htmlspecialchars($x->telefone) : '[N/A]';
echo PHP_EOL;
}? 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- ✅ 使用
is_object($x)而非!empty($x)判断解码结果,因为json_decode('null')返回NULL,json_decode('[]')返回空数组(非对象); - ✅ 启用
json_last_error()可进一步定位 JSON 格式问题(如中文乱码、BOM、换行符干扰); - ✅ 若 Excel 中 JSON 字段含转义双引号(如
"{\"nome\":\"张三\"}"),需确认原始字符串未被重复转义; - ✅ 建议在开发阶段添加
var_dump($data[2])日志,快速识别首几行的实际内容(尤其是表头行)。
? 总结:json_decode() 是“脆弱操作”,绝不可假设输入必然合法。健壮的解析逻辑 = 输入校验 + 解码判断 + 属性防护,三者缺一不可。



















