[英]I want to download a string from an ESP8266 wifi module server using html/javascript
[英]Problem transferring a json string from the client to the esp8266 server
作为我的 WLAN 温度计项目的一部分,我计划对存储在 ESP 上的文件进行小文件管理。 在这种情况下,我需要将文件名列表从客户端传输到服务器。 因为还有用于 ESP 8266 的精彩 ArduinoJSON 库,所以我想将数据作为 JSON 对象传递。 我网页的filelist
的第一个摘录显示了如何创建文件列表(包含 ESP 文件系统中的所有可用文件)以及编译和传输删除deletelist
(应删除其元素)。
let fileID = 0
for (i = 2; i < FDatas.length; i += 2)
{
let fileInfo = {
name: FDatas[i],
size: FDatas[i+1],
fileID: fileID,
marked: false};
fileList.push(fileInfo);
};
}
function deleteFiles() {
let deleteFileList = [];
let fileID = 0;
for (let i = 0; i < fileList.length; i++) {
if (fileList[i].marked == true) {
let keyname = 'fileID_' + String(fileID);
fileID += 1;
let newEntry = {[keyname]:fileList[i].name}
deleteFileList.push(newEntry);
}
}
if (deleteFileList.length > 0) {
var xhttp = new XMLHttpRequest();
var formData = JSON.stringify(deleteFileList);
xhttp.open("POST", "/deleteFiles");
xhttp.send(formData);
}
}
在服务器端,通信组织如下: 在 arduino 代码的设置部分:
webserver.on("/deleteFiles", HTTP_POST, deleteFiles);
在处理程序中:
void deleteFiles() {
String input = webserver.arg("plain");
Serial println(input);
DynamicJsonDocument doc(2048);
DeserializationError err = deserializeJson(doc, input);
if (err) {
Serial.println(F("deserializeJson() failed with code "));
Serial.println(err.f_str());
}
JsonObject obj = doc.as<JsonObject>();
// Loop through all the key-value pairs in obj
for (JsonPair p : obj) {
Serial.println(p.key().c_str());
if (p.value().is<const char*>()) {
auto s = p.value().as<const char*>();
Serial.println(s);
}
}
webserver.send(200);
}
这些努力的结果是发人深省的。 尽管如此, Serial.println(input);
- 命令输出以下内容,
[{"fileID_0":"/settings.json"},{"fileID_1":"/tdata.js"},{"fileID_2":"/scripts.js"}]
通过 JSON 对象的通道不会产生键值对。
我的错误在哪里? 非常感谢您的好建议。
1. 日期:
在第一次发表评论(谢谢)之后,我将 arduino 代码更改为:
void deleteFiles() {
String input = webserver.arg("plain");
Serial.println(input);
DynamicJsonDocument doc(2048);
DeserializationError err = deserializeJson(doc, input);
if (err) {
Serial.println(F("deserializeJson() failed with code "));
Serial.println(err.f_str());
}
JsonArray arr = doc.to<JsonArray>();
for(JsonVariant v : arr) {
Serial.println(v.as<const char*>());
}
webserver.send(200);
}
不幸的是,结果是一样的。 循环中没有结果。
您的 json 对象由一个数组组成(数组的每个元素都由一个数字索引,例如 0、1、2...),并且在数组中,有这 3 个 json 对象。 因此,要访问每个数组元素的数据,请执行doc[0]
等等。 然后,您可以使用doc[0]['key']
表示法访问每个键值对。
StaticJsonDocument<192> doc;
DeserializationError error = deserializeJson(doc, input);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
const char* element1 = doc[0]["fileID_0"]; // "/settings.json"
const char* element2 = doc[1]["fileID_1"]; // "/tdata.js"
const char* element3 = doc[2]["fileID_2"]; // "/scripts.js"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.