Нет совпадения для 'operator =' (типы операндов: 'String' и 'void') - PullRequest
0 голосов
/ 20 октября 2018

Я запрашиваю веб-страницу, которая возвращает строку JSON, используя микроконтроллер NodeMCU ESP8266.Ответ с веб-страницы выглядит следующим образом:

{"1":true,"2":false,"3":false,"4":true,"5":true,"6":false,"7":false,"8":false}

Код, который я использую, выглядит следующим образом:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
String payload = "";
const char* ssid = "ssid";
const char* password = "password";
String url = "example.com/data.json";
void setup() {
  Serial.begin(115200);
  delay(2000); while (!Serial);

  WiFi.begin(ssid, password);
  while (WiFi.status() !=WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println(WiFi.localIP());
  pinMode(D0, OUTPUT);
}
void loop() {
  StaticJsonBuffer<100> jsonBuffer;
  delay(5000);
  HTTPClient http;
  http.begin(url);
  int httpCode = http.GET();
  Serial.println(httpCode);
  Serial.println(http.getString());
  if (httpCode > 0) {
    payload = http.getString();
  }
  http.end();
  JsonObject& root = jsonBuffer.parseObject(payload);
  Serial.println(payload);
  if(!root.success()) {
    Serial.println("parseObject() failed");
  }
  if(root["1"] == true) {
    Serial.println("true");
  }
  digitalWrite(D0, !digitalRead(D0));
}

Я считаю, что причина, по которой он не анализируется, состоит в том, что переменная полезной нагрузки заканчивается назавершающий символ новой строки.Затем я попытался payload = payload.trim();, но затем я получил no match for 'operator=' (operand types are 'String' and 'void'), поэтому я попытался payload = payload.replace("\n,""); та же проблема, затем я попытался payload = String(payload); снова, сбой.Что я делаю не так?

1 Ответ

0 голосов
/ 20 октября 2018

Как кто-то сказал, trim и replace не возвращают String.Он «возвращает» void, сообщение об ошибке говорит вам, что вы пытаетесь назначить возврат void для строки.Достаточно поставить payload.trim();.То же самое касается payload.replace("\n","");

Но payload.trim(); и payload.replace("\n",""); не делают одно и то же.Как упомянуто в документах, trim() удаляет завершающие и начальные пробелы, в то время как replace("\n","") удаляет все (и только) новые строки в строке, даже если она находится в середине.

Пробел обычно относится к пробелу,перевод строки, табуляции и некоторые другие разные символы.

...