#include <ArduinoJson.h>
#include <FS.h>
/* Set these to desired credentials in runtime */
struct Config {
String ssid = "";
String pass = "";
bool hFlag = false;
};
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("");
delay(1000);
//allows serving of files from SPIFFS
Serial.println("Mounting FS...");
if (!SPIFFS.begin()) {
Serial.println("Failed to mount file system");
return;
}
if (readConfigFile("/LaSt.json", false)) {
Serial.println("Config read");
} else {
Serial.println("Failed to read config");
}
}
bool readConfigFile(char* fileName, bool whichFile)
{
File configFile = SPIFFS.open(fileName, "r");
if (!configFile) {
Serial.println("Failed to open config file");
return false;
}
size_t size = configFile.size();
if (size > 1024) {
Serial.println("Config file size is too large");
return false;
}
// Allocate the memory pool on the stack.
// Use arduinojson.org/assistant to compute the capacity.
StaticJsonBuffer<256> jsonBuffer;
// Parse the root object
JsonObject &root = jsonBuffer.parseObject(configFile);
if (!root.success())
Serial.println(F("Failed to read file, using default configuration"));
// Copy values from the JsonObject to the Config
Config.ssid = root["ssid"];
Config.pass = root["pass"];
if (whichFile)
{
Config.hFlag = root["hFlag"];
}
// We don't need the file anymore
configFile.close();
return true;
}
Compile gives error in Copy values from the JsonObject to the Config
section. Error: expected unqualified-id before '.' token
.
Want to read file from SPIFFS, and store in variable to use.
-
Config is type. you do not have an instance of itJuraj– Juraj ♦2018年07月25日 14:51:19 +00:00Commented Jul 25, 2018 at 14:51
2 Answers 2
Your code at the top:
struct Config {
String ssid = "";
String pass = "";
bool hFlag = false;
};
defines a variable "type". It's like making a new int
or bool
, but yours is called struct Config
.
After making the type, you need to create declare an instance of it.
struct Config cfg;
Then, you refer to the one you created:
// Copy values from the JsonObject to the Config struct named cfg
cfg.ssid = root["ssid"];
cfg.pass = root["pass"];
if (whichFile)
{
cfg.hFlag = root["hFlag"];
}
Note that a particular issue with ArduinoJSON and Strings is that you may get an error like:
error: ambiguous overload for 'operator=' (operand types are 'String' and 'ArduinoJson::JsonObjectSubscript<const char*>')
There is an ArduinoJSON FAQ entry that states
Most of the time you can rely on implicit casts.
But there is one notable exception: when you convert a JsonVariant to a String.
For example:
String ssid = network["ssid"]; ssid = network["ssid"];
The first line will compile but the second will fail with the following error:
error: ambiguous overload for 'operator=' (operand types are 'String' and 'ArduinoJson::JsonObjectSubscript<const char*>')
The solution is to remove the ambiguity with any of the following replacement:
ssid = (const char*)network["ssid"]; ssid = network["ssid"].as<const char*>(); ssid = network["ssid"].as<String>();
-
ambiguous overload for 'operator=' (operand types are 'String' and 'ArduinoJson::Internals::JsonObjectSubscript<const char*>')
Dr.PB– Dr.PB2018年07月25日 15:33:29 +00:00Commented Jul 25, 2018 at 15:33 -
-
Are you meaning to ask a new question?jose can u c– jose can u c2018年07月25日 15:49:25 +00:00Commented Jul 25, 2018 at 15:49
-
No, just mentioned that in the particular case,
string
variable type will give the error, and the workarounds are given in the links. However, those workarounds also produce warnings.Dr.PB– Dr.PB2018年07月25日 15:52:44 +00:00Commented Jul 25, 2018 at 15:52
#include FS.h #include ESP8266WiFi.h #include ArduinoJson.h /* Set these to desired credentials in runtime */ String ssid = "tttttttt"; String pass = "ssssssss"; #define fileName "/LaSt.json" DynamicJsonBuffer jsonBuffer; void setup() { // put your setup code here, to run once: Serial.begin(115200); Serial.println(""); delay(1000); //allows serving of files from SPIFFS Serial.println("Mounting FS..."); if (SPIFFS.begin()) { if (SPIFFS.exists(fileName)) { File subscribedUsersFile = SPIFFS.open(fileName, "r"); delay(10); String file_content = subscribedUsersFile.readString(); JsonObject& users = jsonBuffer.parseObject(file_content); if(users.containsKey("ssid")) {ssid=users["ssid"].as();} if(users.containsKey("pass")) {pass=users["pass"].as();} subscribedUsersFile.close(); users.prettyPrintTo(Serial); } else { // Create empty file (w+ not working as expect) File subscribedUsersFile = SPIFFS.open(fileName, "a+"); JsonObject& users = jsonBuffer.createObject(); users.set("ssid", ssid); users.set("pass", pass); users.printTo(subscribedUsersFile); users.printTo(Serial); subscribedUsersFile.close(); Serial.println("New Config File Created...\n"); users.prettyPrintTo(Serial); } } }
-
Answer could be improved by adding a sentence or two of explanation!! Please consider.MichaelT– MichaelT2019年04月08日 21:07:53 +00:00Commented Apr 8, 2019 at 21:07