PHP遍历Nanopool返回的复杂JSON对象失败,求解决方案
如何正确遍历Nanopool API返回的支付记录JSON数据
我来帮你解决这个遍历Nanopool API返回数据的问题,你的代码出错主要是两个原因:没有定位到正确的数据数组,以及混淆了对象和数组的访问方式。
首先,你用json_decode($json)得到的是一个stdClass对象,从var_dump的结果能看到,这个对象有两个属性:status(布尔值)和data(存储支付记录的数组)。你之前的foreach($decode as $item)是直接遍历整个顶层对象,第一个循环拿到的是status的值,这显然不是你要的支付记录,自然会报错。
而且,data数组里的每一条记录也是stdClass对象,不是关联数组,所以不能用$item['date']这种数组键名的方式访问属性,得用对象的属性访问符->。
正确的遍历代码(对象方式)
$json = file_get_contents("https://api.nanopool.org/v1/eth/payments/0x218494b2284a5f165ff30d097d3d7a542ff0023B"); $decode = json_decode($json); // 先判断接口返回状态是否成功 if ($decode->status === true) { // 遍历data数组里的每一条支付记录 foreach ($decode->data as $payment) { // 用对象属性访问方式获取值 $date = $payment->date; $amount = $payment->amount; // 可以在这里处理数据,比如格式化日期、输出等 echo "日期:" . date('Y-m-d H:i:s', $date) . ",金额:" . $amount . "<br>"; } } else { echo "API请求失败"; }
可选:转成关联数组遍历
如果你更习惯用数组的方式访问,可以在json_decode的时候加上第二个参数true,这样会把JSON转成关联数组:
$json = file_get_contents("https://api.nanopool.org/v1/eth/payments/0x218494b2284a5f165ff30d097d3d7a542ff0023B"); // 第二个参数true,转成关联数组 $decode = json_decode($json, true); if ($decode['status'] === true) { foreach ($decode['data'] as $payment) { $date = $payment['date']; $amount = $payment['amount']; echo "日期:" . date('Y-m-d H:i:s', $date) . ",金额:" . $amount . "<br>"; } } else { echo "API请求失败"; }
为什么你的原代码不行?
- 遍历对象错误:你直接遍历顶层的
$decode对象,它包含status和data两个属性,第一个循环拿到的是true(status的值),这个布尔值没有date属性,直接报错。 - 访问方式错误:即使你遍历到
data数组,里面的元素是对象,用$item['date']这种数组访问方式会触发错误,因为对象不能用数组键名访问属性。
这样应该就能正确提取每条记录的date和amount了。
内容的提问来源于stack exchange,提问作者R_life_R
相关产品推荐
相关产品推荐

