PHP中使用对象语法访问带数字键JSON数据的问题
为什么PHP中用对象语法访问数字键的JSON属性会失败?
你遇到的问题核心是PHP对象的属性命名规则和JSON解析后的结构差异,以下是具体原因和解决方法:
1. JSON解析的两种模式差异
json_decode() 默认会把JSON字符串解析为 stdClass 对象,但如果传入第二个参数 true,会解析为关联数组:
- 数组允许使用数字作为键名,所以你用
$jsonobj['inverters'][0]['AC'][0]['Power']['v']能正常运行; - 但对象模式下,属性名如果是纯数字(比如你的
AC下的0),不能直接用常规的->语法访问。
2. 两种错误写法的问题
$jsonobj->inverters[0]->AC[0]->Power->v失败原因:这里你把AC当作数组来用下标[0]访问,但AC在对象模式下是stdClass实例,不是数组。stdClass没有实现数组访问的接口,所以对对象使用数组下标会触发错误。$jsonobj->inverters[0]->AC->0->Power->v失败原因:PHP的标识符(包括对象属性名)不能以数字开头,直接写->0会被语法解析器当成数字字面量,而非属性名,直接触发语法错误。
3. 正确的对象语法访问方式
要访问数字命名的对象属性,必须用花括号包裹属性名,让PHP明确识别这是一个属性名,而非数字:
$jsonobj->inverters[0]->AC->{0}->Power->v
总结
本质是PHP语法规则限制了直接使用数字作为对象属性的访问方式,而关联数组没有这个限制,所以数组模式下可以直接用数字键访问。
内容的提问来源于stack exchange,提问作者BeeJayF
相关产品推荐
相关产品推荐

