PHP如何访问键名包含句点(.)的JSON字段值
PHP访问JSON中带
.键名的实现方法 带.的键名在JSON解析后属于完整的字符串键,不存在特殊语法,之前访问失败基本是误用对象链式操作、错误拆分键名导致的,按以下步骤处理即可:
第一步:正确解码JSON
推荐将JSON解码为关联数组,比stdClass对象处理特殊字符键名的容错率更高,解码时开启异常抛出方便排查格式错误:
// 此处替换为你实际接收到的树莓派上传的JSON原始字符串 $rawJson = '{ "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 } ] }'; // 第二个参数传true=输出关联数组,JSON_THROW_ON_ERROR=格式错误时直接抛异常方便排查 $data = json_decode($rawJson, true, 512, JSON_THROW_ON_ERROR);
第二步:按层级访问对应字段
注意result是索引数组,第一条数据下标为0;带.的键要把整个含点的字符串作为完整键名,不要按点拆分层级:
// 车辆连接状态 $connected = $data['result'][0]['connected']; // bool(true) // 剩余续航(带点的完整键名,不要拆分) $remainingRange = $data['result'][0]['telemetry']['actual.remaining.mileage']; // float(26.81) // 总行驶里程(带点的完整键名) $totalMileage = $data['result'][0]['telemetry']['vehicle.mileage']; // float(624.071) // 嵌套position结构下的定位数据(这里position是真实的嵌套层级,不是键名带点) $lat = $data['result'][0]['telemetry']['position']['latitude']; // float(34.799687) $lng = $data['result'][0]['telemetry']['position']['longitude']; // float(7.478863) $currentSpeed = $data['result'][0]['telemetry']['position']['speed']; // int(0) $satCount = $data['result'][0]['telemetry']['position']['satellites']; // int(0) // 平铺存储的海拔字段(键名带点) $flatAltitude = $data['result'][0]['telemetry']['position.altitude']; // int(0)
常见踩坑说明
- 不要用纯对象链式写法直接访问带点的键:类似
$data->result[0]->telemetry->actual.remaining.mileage的写法会被PHP解析为多层嵌套属性,必然报属性不存在错误。如果坚持用对象模式解码(json_decode第二个参数传false),带点的键需要用大括号包裹键名访问,写法为$data->result[0]->telemetry->{'actual.remaining.mileage'},日常开发更推荐关联数组写法,更简洁不易出错。- 解码后建议先打印
$data结构确认解析结果:如果JSON格式存在传输乱码、截断问题,json_decode会返回null,可通过json_last_error_msg()排查具体错误原因。
内容的提问来源于stack exchange,提问作者CableGuy
相关产品推荐
相关产品推荐

