在Arduino的C++环境中如何实现类似JS的键值对对象?
在Arduino(C++)中实现类似JavaScript的键值对结构
针对你想要的键值对(类似JSON/JS对象)需求,这里提供三种适合Arduino环境的实现方式,从轻量到功能丰富:
方案1:结构体数组 + 自定义查找函数(无额外依赖,最省内存)
这种方法不需要任何额外库,适合资源有限的小型Arduino板(比如Uno),核心是用结构体存储键值对,再写一个简单的查找函数来通过键获取值:
// 定义存储时区的结构体 struct TimeZone { const char* city; // 城市名(键) int offset; // 时区偏移(值) }; // 初始化键值对数组 TimeZone timeZones[] = { {"London", 0}, {"Paris", 1}, {"Sydney", 10}, {"Los Angeles", -8} }; // 计算数组元素个数 const int timeZoneCount = sizeof(timeZones) / sizeof(timeZones[0]); // 根据城市名查找时区偏移的函数 int getTimeZoneOffset(const char* targetCity) { for (int i = 0; i < timeZoneCount; i++) { // 用strcmp比较字符串是否相等 if (strcmp(timeZones[i].city, targetCity) == 0) { return timeZones[i].offset; } } // 如果找不到,返回默认值(这里设为0) return 0; } // 使用示例 void setup() { int pst = getTimeZoneOffset("Los Angeles") * 3600; // 后续可以使用pst变量做其他操作 } void loop() { // 循环代码 }
方案2:使用std::map(C++标准容器,用法更直观)
C++的std::map是原生的键值对容器,用法和JS对象最接近,但会占用更多内存,适合内存充足的Arduino板(比如Mega):
#include <map> #include <string> // 初始化键值对容器 std::map<std::string, int> timeZones = { {"London", 0}, {"Paris", 1}, {"Sydney", 10}, {"Los Angeles", -8} }; // 使用示例 void setup() { // 直接通过键访问值,和JS写法几乎一致 int pst = timeZones["Los Angeles"] * 3600; } void loop() { // 循环代码 }
注意:部分小型Arduino板可能需要在IDE中开启C++11及以上支持(在文件→首选项→附加开发板管理器网址的配置中添加相关设置,或在平台IO中修改编译选项)。
方案3:使用ArduinoJson库(推荐复杂JSON场景)
如果后续需要处理更复杂的JSON结构(比如嵌套键值对),可以用专门为Arduino设计的ArduinoJson库,内存效率高且功能强大:
- 先在Arduino IDE的「库管理器」中搜索安装
ArduinoJson库 - 编写代码:
#include <ArduinoJson.h> void setup() { // 静态分配内存(128字节足够存储你的时区数据) StaticJsonDocument<128> timeZones; // 添加键值对 timeZones["London"] = 0; timeZones["Paris"] = 1; timeZones["Sydney"] = 10; timeZones["Los Angeles"] = -8; // 访问值,需要用as<int>()转换类型 int pst = timeZones["Los Angeles"].as<int>() * 3600; } void loop() { // 循环代码 }
如果需要处理更大的JSON数据,可以换成DynamicJsonDocument(动态分配内存)。
内容的提问来源于stack exchange,提问作者OnyxWingman
相关产品推荐
相关产品推荐

