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

引入合法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文件系统,运行时读取解析:

  1. 在Arduino IDE中安装SPIFFS上传工具
  2. 将menuContent.json放在项目的data文件夹,上传到ESP32
  3. 代码中读取文件:
#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:29:52