繁体   English   中英

将 json 字符串从客户端传输到 esp8266 服务器时出现问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM