问题将JSON字符串从客户端传输到ESP8266服务器

发布于 2025-02-08 15:35:13 字数 2697 浏览 3 评论 0原文

作为我的WLAN温度计项目的一部分,我正在计划为ESP上存储的文件进行小型文件管理。在这种情况下,我需要将文件名列表从客户端传输到服务器。因为还有ESP 8266的精美Arduinojson库,所以我想将数据作为JSON对象传递。我网页的scripts.js的第一个摘录显示了如何创建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(输入); - 命令输出以下内容,

 [{"fileID_0":"/settings.json"},{"fileID_1":"/tdata.js"},{"fileID_2":"/scripts.js"}]

通过JSON对象的段落不会导致键值对。

我的错误在哪里?非常感谢您的好建议。

1。 udate:

在第一次评论后(谢谢),我将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);
}

不幸的是,结果是相同的。没有结果。

As part of my WLAN Thermometer project, I am planning a small file management for the files stored on the ESP. In this context, I need to transfer a list of file names from the client to the server. Because there is also the wonderful ArduinoJSON library for the ESP 8266, I would like to pass the data as a JSON object. The first excerpt from the scripts.js of my webpage shows how to create the filelist (contains all available files at ESP Filesystem) and compile and transfer the deletelist (whose elements should be deleted).

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);
    }
 }

On the server side, communication is organized as follows:
In the setup part of the arduino code:

  webserver.on("/deleteFiles", HTTP_POST, deleteFiles);

In the handler:

  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);
  }

The result of these efforts is sobering. Nevertheless, the Serial.println(input); - command outputs the following,

 [{"fileID_0":"/settings.json"},{"fileID_1":"/tdata.js"},{"fileID_2":"/scripts.js"}]

the passage through the JSON object does not result in key value pairs.

Where is my mistake? Thank you very much for your good advice.

1. Udate:

After first comment (Thank You) I've changed the arduino-code to:

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);
}

Unfortunately, the result is the same. No result in the loop.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

只是偏爱你 2025-02-15 15:35:13

您的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"

Your json object consists of an array(each element of an array is indexed by a number like 0, 1, 2...), and within the array, there are these 3 json objects. So to access the data of each array element, you do doc[0] and so on. You can then access each key value pair with doc[0]['key'] notation.

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"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文