Fix: skip BOM in JSON files (pin_mapping and config)

based on #2387
This commit is contained in:
Thomas Basler 2024-11-01 22:07:48 +01:00
parent 6c903abda1
commit 55c98ef880
4 changed files with 18 additions and 0 deletions

View File

@ -2,6 +2,7 @@
#pragma once #pragma once
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <LittleFS.h>
#include <cstdint> #include <cstdint>
class Utils { class Utils {
@ -12,4 +13,5 @@ public:
static bool checkJsonAlloc(const JsonDocument& doc, const char* function, const uint16_t line); static bool checkJsonAlloc(const JsonDocument& doc, const char* function, const uint16_t line);
static void removeAllFiles(); static void removeAllFiles();
static String generateMd5FromFile(String file); static String generateMd5FromFile(String file);
static void skipBom(File& f);
}; };

View File

@ -159,6 +159,7 @@ bool ConfigurationClass::write()
bool ConfigurationClass::read() bool ConfigurationClass::read()
{ {
File f = LittleFS.open(CONFIG_FILENAME, "r", false); File f = LittleFS.open(CONFIG_FILENAME, "r", false);
Utils::skipBom(f);
JsonDocument doc; JsonDocument doc;

View File

@ -4,6 +4,7 @@
*/ */
#include "PinMapping.h" #include "PinMapping.h"
#include "MessageOutput.h" #include "MessageOutput.h"
#include "Utils.h"
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <LittleFS.h> #include <LittleFS.h>
#include <string.h> #include <string.h>
@ -199,6 +200,8 @@ bool PinMappingClass::init(const String& deviceMapping)
return false; return false;
} }
Utils::skipBom(f);
JsonDocument doc; JsonDocument doc;
// Deserialize the JSON document // Deserialize the JSON document
DeserializationError error = deserializeJson(doc, f); DeserializationError error = deserializeJson(doc, f);

View File

@ -111,3 +111,15 @@ String Utils::generateMd5FromFile(String file)
return md5.toString(); return md5.toString();
} }
void Utils::skipBom(File& f)
{
// skip Byte Order Mask (BOM). valid JSON docs always start with '{' or '['.
while (f.available() > 0) {
int c = f.peek();
if (c == '{' || c == '[') {
break;
}
f.read();
}
}