
本文详解 PHP 中解析含空格键名(如 "Entry ID"、"Submit Date")的嵌套 JSON 数据时的常见错误与正确访问方式,重点解决因误用数组遍历导致的 Trying to get property of non-object 错误。
本文详解 php 中解析含空格键名(如 "entry id"、"submit date")的嵌套 json 数据时的常见错误与正确访问方式,重点解决因误用数组遍历导致的 `trying to get property of non-object` 错误。
在 PHP 中处理第三方 API 返回的 JSON 数据时,常会遇到键名包含空格、连字符或特殊字符的情况(例如 "Entry ID"、"Submit Date")。若直接使用标准对象属性语法(如 $obj->Entry ID)会触发语法错误;而若错误地将对象当作数组遍历,则会导致 Notice: Trying to get property 'X' of non-object——这正是问题中第 46–47 行报错的根本原因。
关键在于理解 json_decode() 的默认行为:不传入第二个参数 true 时,返回的是 stdClass 对象树,而非关联数组。观察 print_r 输出看似是数组,实则是嵌套的 stdClass 对象(可通过 var_dump($data) 验证)。因此,$entr->values 是一个对象,其内部字段(如 "Entry ID")必须通过花括号语法 ->{'Entry ID'} 直接访问,不可用 foreach($entr->values as $valores) 遍历——因为 stdClass 对象本身不可被 foreach 迭代(除非显式实现 Iterator 接口)。
✅ 正确做法如下:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
<?php $response = curl_exec($curl);
$data = json_decode($response); // 默认返回对象
// 遍历 entries 数组(注意:entries 是数组,但每个元素是对象)
foreach ($data->entries as $entr) {
// values 是 stdClass 对象,直接访问其带空格的属性
$entry_id = $entr->values->{'Entry ID'};
$submit_date = $entr->values->{'Submit Date'};
$submitter = $entr->values->{'Submitter'};
$assignee = $entr->values->{'Assignee'};
echo "ID: {$entry_id}, Submitted: {$submit_date}, By: {$submitter}\n";
}
?>
⚠️ 注意事项:
-
禁止对
stdClass对象使用foreach:$entr->values不是数组,foreach($entr->values as $v)会尝试遍历对象属性,但 PHP 默认不支持,且逻辑上也不合理(你并非要遍历所有字段,而是精准取值)。 -
空格键名必须用
->{'key name'}语法:这是 PHP 唯一合法访问含空格/特殊字符对象属性的方式;$obj->Entry ID会解析为$obj->Entry加非法标识符ID,直接报错。 -
增强健壮性建议:添加空值检查与异常处理,避免因字段缺失导致 Notice:
$entry_id = $entr->values->{'Entry ID'} ?? 'N/A'; $submit_date = $entr->values->{'Submit Date'} ?? null; if ($submit_date && DateTime::createFromFormat(DateTime::ISO8601, $submit_date)) { // 可安全转换为 DateTime 对象 } -
替代方案(使用关联数组):若偏好数组操作,可传入
true参数:$data = json_decode($response, true),此时需改用方括号语法:$entr['values']['Entry ID']。但需注意:此方式下所有键名均变为字符串索引,且无法使用面向对象的链式调用。
总结:处理含空格 JSON 键的核心原则是——明确数据结构类型,严格区分对象访问(-> + {'key'})与数组访问([]),杜绝混淆迭代目标。只要正确识别 values 是对象而非数组,并采用花括号属性访问法,即可稳定、高效地提取任意命名规范的嵌套字段。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










