You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino中是否存在可直接访问数组与JsonArray最后一个元素的函数?

Arduino开发中获取JsonArray最后一个元素的实现方案

现有代码问题说明

你当前计算数组长度的逻辑存在错误:

  • JsonArray是ArduinoJson库封装的动态容器类,不是原生C语言数组,使用sizeof(Time_hours) / sizeof(int)得到的是类对象的内存占用大小,和数组实际存储的元素个数无关,必须调用JsonArray自带的size()方法获取实际元素数量。

实现类似Python a[-1]访问效果的方法

通用兼容方案(适用于所有ArduinoJson版本)

只要数组非空,取下标为数组长度 - 1的元素即为最后一个元素,示例如下:

JsonArray Time_hours = doc["Time"]["hours"];
JsonArray Time_min = doc["Time"]["min"];

// 操作前先校验数组有效性、长度一致且非空,避免越界崩溃
if (Time_hours.isNull() || Time_min.isNull() || Time_hours.size() != Time_min.size() || Time_hours.size() == 0) {
  return;
}

// 获取最后一个元素
int last_hour = Time_hours[Time_hours.size() - 1];
int last_min = Time_min[Time_min.size() - 1];

极简方案(仅适用于ArduinoJson 6及以上版本)

ArduinoJson 6+版本原生支持负索引语法,可直接用Time_hours[-1]访问最后一个元素,和Python用法完全一致,仅需提前确认数组非空即可。

适配你的业务逻辑的修正代码

如果你只需要判断最后一组时间是否匹配,不需要遍历全数组:

JsonArray Time_hours = doc["Time"]["hours"];
JsonArray Time_min = doc["Time"]["min"];

if (Time_hours.isNull() || Time_min.isNull() || Time_hours.size() != Time_min.size() || Time_hours.size() == 0) {
  return;
}

if (now.hour() == Time_hours[-1] && now.minute() == Time_min[-1]) {
  ring_bell(1);
}

如果你需要遍历所有时间点做判断,修正后的遍历代码如下:

JsonArray Time_hours = doc["Time"]["hours"];
JsonArray Time_min = doc["Time"]["min"];

if (Time_hours.isNull() || Time_min.isNull() || Time_hours.size() != Time_min.size()) {
  return;
}

int arr_len = Time_hours.size();
// 注意数组下标从0开始,原代码i=1会漏掉第一个元素
for(int i = 0; i < arr_len ;i++){
  if(now.hour() == Time_hours[i] && now.minute() == Time_min[i])
  {
    ring_bell(1);
  }
}

内容的提问来源于stack exchange,提问作者saud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:12:02