
本文详解 PHP 解析含空格键名(如 "Entry ID"、"Submit Date")的嵌套 JSON 时的常见错误,指出 foreach($obj->values as $v) 的误用根源,并提供使用对象箭头语法 ->{'Key Name'} 和数组模式双保险的正确实践。
本文详解 php 解析含空格键名(如 "entry id"、"submit date")的嵌套 json 时的常见错误,指出 `foreach($obj->values as $v)` 的误用根源,并提供使用对象箭头语法 `->{'key name'}` 和数组模式双保险的正确实践。
在 PHP 中解析 JSON 时,若原始数据包含带空格或特殊字符的键名(例如 "Entry ID"、"Submit Date"、"Assigned Group"),直接使用标准对象属性访问语法(如 $obj->Entry ID)会报错——因为 PHP 不允许标识符含空格。开发者常误以为 json_decode() 返回的嵌套结构仍是可遍历的数组,从而写出类似 foreach($entr->values as $valores) 的代码,导致 “Trying to get property 'X' of non-object” 错误。
根本原因在于:json_decode($json) 默认返回 stdClass 对象树,而非关联数组;而 values 是一个对象(不是数组),不能用 foreach 遍历其属性。print_r 输出中显示为 Array 是因 print_r 对 stdClass 对象做了友好格式化,易造成误解。
✅ 正确做法是:直接通过花括号语法访问带空格的属性名:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
<?php
$response = curl_exec($curl);
$data = json_decode($response); // 默认返回对象
foreach ($data->entries as $entry) {
// ✅ 正确:用 ->{'Key Name'} 访问含空格的属性
$entry_id = $entry->values->{'Entry ID'};
$submit_date = $entry->values->{'Submit Date'};
$assignee = $entry->values->{'Assignee'};
echo "ID: {$entry_id}, Submitted: {$submit_date}, Assignee: {$assignee}\n";
}
?>⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 若 JSON 深度不确定或需更高灵活性,可改用
json_decode($json, true)强制返回关联数组,此时用方括号语法访问:$entry['values']['Entry ID']; - 建议添加健壮性检查,避免因键缺失导致 Notice:
$entry_id = $entry->values->{'Entry ID'} ?? 'N/A'; // 或使用 isset() $submit_date = isset($entry->values->{'Submit Date'}) ? $entry->values->{'Submit Date'} : date('c'); - 空格键名在 JSON 中合法,但不利于长期维护;如可控服务端,建议统一采用
snake_case(如entry_id)或camelCase(如entryId)命名规范。
总结:处理含空格键名的 JSON,核心是理解 json_decode() 的返回类型差异,并善用 ->{'key name'} 语法。结合空合并操作符(??)和 isset(),即可写出简洁、安全、可维护的解析逻辑。


















