Arduino项目中timestamp可串口打印但无法存入StaticJsonDocument问题
Arduino项目中Timestamp无法写入StaticJsonDocument的问题
问题背景
我正在开发一个Arduino项目,以下是核心方法的代码片段,需重点关注String timestamp参数:
HttpUpstreamClient类的sendAlarmDeviceId方法
void HttpUpstreamClient::sendAlarmDeviceId(char* alarmType, char* alarmText, char* severity, String timestamp,char* URL, String deviceID ){ Serial.print("The alarm is sent to the device: "); Serial.println(deviceID); Serial.println(timestamp); StaticJsonDocument<100> root; JsonObject source = root.createNestedObject("source"); source["id"] = deviceID; root["type"] = alarmType; root["text"] = alarmText; root["severity"] = severity; root["time"] = timestamp; String body2send= ""; serializeJsonPretty(root, body2send); Serial.println(body2send); if(_networkClient->connect(URL,443)){ Serial.println("Connected to server"); _networkClient->println("POST /alarm/alarms HTTP/1.1"); _networkClient->print("Host: "); _networkClient->println(URL); _networkClient->print("Authorization: Basic "); _networkClient->println(_base64); _networkClient->println("Content-Type: application/json"); _networkClient->print("Content-Length: "); _networkClient->println(body2send.length()); _networkClient->println("Accept: application/json"); _networkClient->println(); //client.println("Connection: close"); _networkClient->println(body2send); } }
main.ino中的loop()函数片段
void loop() { // put your main code here, to run repeatedly: // from the server, read them and print them: while (nwc.available()) { char c = nwc.read(); //Serial.print(c); } timeClient.update(); delay(1000); clienttest.sendAlarmDeviceId(alarm_Type, alarm_Text,Severity,timeClient.getFormattedDate(),URL,"2556130"); }
当前异常现象
Serial.println(timestamp);可以正常输出时间戳内容,但将timestamp赋值给StaticJsonDocument<100> root的time字段后,该字段在序列化后的JSON中不生效(要么缺失,要么值为空)。
排查与解决方案
- 增大StaticJsonDocument容量:当前定义的
StaticJsonDocument<100>容量过小,无法容纳完整的JSON结构(包括嵌套的source对象和较长的时间戳字符串)。建议将容量调整为StaticJsonDocument<256>或更大:StaticJsonDocument<256> root; - 改用C风格字符串赋值:尝试将String类型的timestamp转换为C风格字符串后赋值,避免String类型的潜在兼容问题:
root["time"] = timestamp.c_str(); - 检查序列化前的Document状态:在
serializeJsonPretty前添加串口打印,直接输出Document内容,确认赋值是否成功:serializeJson(root, Serial); // 直接打印Document的原始JSON - 确认时间戳字符串格式:验证
timeClient.getFormattedDate()返回的字符串是否包含特殊字符或过长内容,导致无法被ArduinoJson正常处理。
内容的提问来源于stack exchange,提问作者hellooooo
相关产品推荐
相关产品推荐

