PHP中如何判断JSON解析后的Activity是对象还是数组?
问题分析与解决方案
你遇到的核心问题是:用json_decode($json, true)将JSON转为关联数组时,单个Activity对象会被解析成一维关联数组,而多个Activity会被解析成二维数组。这时候is_array()对两种情况都会返回true,count()统计的是关联数组的属性数量(也就是单个对象的字段数,比如你得到的4),而非对象个数。
下面提供两种可靠的判断方式:
方式1:保留JSON对象类型(不转关联数组)
直接使用json_decode的默认行为(第二个参数不传true),此时单个Activity是stdClass对象,多个Activity是包含stdClass的数组,用is_array()可以准确区分:
// 解析JSON,保留对象类型 $response = json_decode($json_data); $activity = $response->TrackResponse->Activity; if (is_array($activity)) { // 处理对象数组,count结果为对象个数 $total = count($activity); echo "Activity是数组,共{$total}个对象"; } else { // 处理单个对象,可转为数组统一后续逻辑 $activity = [$activity]; echo "Activity是单个对象,已转为数组处理"; }
方式2:转为关联数组后判断索引类型
如果必须使用关联数组,可通过判断数组的键是否为数字索引来区分:
单个对象转成的关联数组,键是字符串(比如EventTime、Description);而对象数组的键是0、1、2这类数字索引。
// 解析为关联数组 $response = json_decode($json_data, true); $activity = $response['TrackResponse']['Activity']; // 检查是否为数字索引数组(即多个对象) if (is_array($activity) && is_int(key($activity))) { $total = count($activity); echo "Activity是数组,共{$total}个对象"; } else { // 单个对象转为数组 $activity = [$activity]; echo "Activity是单个对象,已转为数组处理"; }
补充说明
之前count($activity)得到4,是因为单个JSON对象被转成关联数组后,统计的是该数组的键值对数量(也就是对象的4个字段),而非你期望的对象个数。通过上面两种方式,就能准确区分并统一后续的处理逻辑。
内容的提问来源于stack exchange,提问作者ihorko
相关产品推荐
相关产品推荐

