
本文讲解如何使用 json_decode() 将 json 解析为关联数组,并通过标准方括号语法直接访问含英文点号(如 "actual.remaining.mileage")的嵌套键名,避免因非法变量名导致的语法错误。
本文讲解如何使用 json_decode() 将 json 解析为关联数组,并通过标准方括号语法直接访问含英文点号(如 "actual.remaining.mileage")的嵌套键名,避免因非法变量名导致的语法错误。
在 PHP 中处理来自 IoT 设备(如 Cube 电动自行车)的 JSON 数据时,常会遇到键名包含特殊字符(尤其是英文句号 .)的情况。这类键名无法通过对象属性访问(例如 $obj->actual.remaining.mileage 会触发语法错误),但只要将 JSON 解码为关联数组(即传入 true 作为第二个参数),即可用原样字符串键名进行安全访问。
✅ 正确做法:使用 json_decode($json, true) 转为关联数组,再用方括号语法读取:
$json = '{
"result": [
{
"telemetry": {
"actual.remaining.mileage": 26.81,
"position": {
"altitude": 0,
"direction": 0,
"latitude": 34.799687,
"longitude": 7.478863,
"satellites": 0,
"speed": 0
},
"position.altitude": 0,
"vehicle.mileage": 624.071
},
"connected": true
}
]
}';
$data = json_decode($json, true); // 关键:true → 返回关联数组
// 直接使用带点的字符串键名(无需转义或替换)
$remainingMileage = $data['result'][0]['telemetry']['actual.remaining.mileage']; // 26.81
$latitude = $data['result'][0]['telemetry']['position']['latitude']; // 34.799687
$vehicleMileage = $data['result'][0]['telemetry']['vehicle.mileage']; // 624.071
$connected = $data['result'][0]['connected']; // true⚠️ 注意事项:
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
- 切勿省略 true 参数:若使用 json_decode($json)(默认返回 stdClass 对象),则 $obj->telemetry->actual.remaining.mileage 会被 PHP 解析为 $obj->telemetry->actual 减去 remaining 再减去 mileage,导致致命错误。
- 务必校验数据结构:生产环境应增加健壮性检查,防止因 API 响应异常(如空数组、缺失字段)引发 Notice 或 Warning:
if (isset($data['result'][0]['telemetry']['actual.remaining.mileage'])) {
$mileage = $data['result'][0]['telemetry']['actual.remaining.mileage'];
} else {
$mileage = null; // 或抛出异常 / 记录日志
}? 扩展提示:若需动态访问不确定结构的带点键名(如 a.b.c),可封装工具函数递归解析,但对本例中的固定路径,直接数组索引是最清晰、高效的方式。
立即学习“PHP免费学习笔记(深入)”;
总结:PHP 处理含点号的 JSON 键名,核心在于「解码为关联数组 + 字符串键直接访问」,无需正则替换、eval 或第三方库——简洁、安全、符合最佳实践。


















