引入合法JSON文件导致ESP32 Arduino C++代码编译失败求助
问题:ESP32引入JSON文件编译报错
我正在为ESP32 WROOM开发通用菜单,搭配Waveshare 240x240px圆形LCD和旋转编码器。为实现通用性,菜单结构用外部JSON文件描述(已验证格式合法),目标是让主程序解析任意JSON配置快速生成菜单,通过LCD显示、旋转编码器控制。
主代码中文件引入方式如下:
#include "SPI.h" #include "Adafruit_GFX.h" #include "Adafruit_GC9A01A.h" #include <ArduinoJson.h> #include "menuContent.json" #include <Fonts/FreeSans12pt7b.h>
注释掉#include "menuContent.json"时编译正常,否则出现如下错误:
error: expected unqualified-id before '{' token { ^
menuContent.json文件内容:
{ "fanMode":{ "id":"1000", "parent_id":"0000", "interaction":"click", "childInteraction":"oneOfN", "label":"Fan mode", "children":{ "humidity":{ "id":"1100", "parent_id":"1000", "childInteraction":"longPress", "label":"Humidity", "children":{ "humidityValue":{ "type":"setting", "id":"1110", "parent_id":"1100", "units":"%", "default":80, "rangeLower":50, "rangeUpper":100, "step":5, "shortPress":".." } } }, "shortTimer":{ "id":"1200", "parent_id":"1000", "childInteraction":"longPress", "label":"Short Timer", "children":{ "shortTimerValue":{ "type":"setting", "id":"1210", "parent_id":"1200", "units":"min", "default":5, "rangeLower":5, "rangeUpper":30, "step":5, "fallback":"1100", "shortPress":".." } } }, "longTimer":{ "id":"1300", "parent_id":"1000", "childInteraction":"longPress", "label":"Long Timer", "children":{ "longTimerValue":{ "type":"setting", "id":"1310", "parent_id":"1300", "units":"min", "default":30, "rangeLower":30, "rangeUpper":90, "step":5, "fallback":"1100", "shortPress":".." } } }, "off":{ "id":"1400", "parent_id":"1000", "childInteraction":"longPress", "label":"Off", "children":{ "OffTime":{ "type":"setting", "id":"1410", "parent_id":"1400", "units":"min", "default":"∞", "rangeLower":30, "rangeUpper":90, "step":5, "fallback":"1100", "shortPress":".." } } } } }, "mirror":{ "id":"2000", "parent_id":"0000", "interaction":"click", "childInteraction":"oneOfN", "label":"Mirror", "children":{ "light":{ "id":"2100", "parent_id":"2000", "childInteraction":"longPress", "label":"Mirror", "children":{ "lightTimeoutValue":{ "type":"setting", "id":"2110", "parent_id":"2100", "units":"min", "default":30, "rangeLower":5, "rangeUpper":65, "step":10, "shortPress":".." } } }, "demist":{ "id":"2200", "parent_id":"2000", "childInteraction":"longPress", "label":"Demist", "children":{ "demisterTimeoutValue":{ "type":"setting", "id":"2210", "parent_id":"2200", "units":"min", "default":"humidityThresholdVal", "rangeLower":5, "rangeUpper":60, "step":5, "shortPress":".." } } } } }, "clock":{ "id":"3000", "parent_id":"0000", "interaction":"click", "childInteraction":"oneOfN", "label":"Clock", "children":{ "defaultTheme":{ "id":"3100", "parent_id":"3000", "label":"Default theme" }, "userTheme":{ "id":"3200", "parent_id":"3000", "label":"Default theme" } } } }
错误原因及解决方法
- 错误原因:C/C++编译器会将
#include的文件内容直接插入代码中,JSON的{开头会被当作C语法解析,而这不符合C语言规则,导致编译报错。
解决方法1:将JSON转为C字符数组
创建menuContent.h文件,把JSON内容包裹在C原始字符串中:
const char menuContent[] PROGMEM = R"JSON( { // 完整JSON内容 } )JSON";
主代码中替换为#include "menuContent.h",后续使用ArduinoJson解析这个字符数组即可。
解决方法2:使用SPIFFS存储JSON文件
将JSON文件上传到ESP32的SPIFFS文件系统,运行时读取解析:
- 在Arduino IDE中安装SPIFFS上传工具
- 将
menuContent.json放在项目的data文件夹,上传到ESP32 - 代码中读取文件:
#include <SPIFFS.h> void setup() { if (!SPIFFS.begin(true)) { // 处理SPIFFS初始化失败 return; } File file = SPIFFS.open("/menuContent.json", "r"); if (!file) { // 处理文件打开失败 return; } DynamicJsonDocument doc(4096); deserializeJson(doc, file); file.close(); // 操作doc中的JSON数据 }
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

