JSON, einfach erklärt!
by Edi · 05/03/2022
Was ist JSON?
JSON steht für JavaScript Object Notation und es ist ein Datenformat, in dem Informationen wie Objekte, Arrays und sonstige Variablen in einer einfach lesbaren Form gespeichert werden können. JSON ist komplett unabhängig von Programmiersprachen, das dennoch viele Konventionen folgt, und sich daher hervorragend für den Datenaustausch eignet.
Datentypen in JSON
Daten können beliebig verschachtelt werden in Objekte und als geordnete Listen, den sogenannten Arrays.
Nullwert: ein leerer Wert, der mit null dargestellt wird.
Boolescher Wert: der mit true oder false dargestellt wird.
Zahl: eine Zahl von 0 bis 9, die auch ein – negatives Vorzeichen haben kann, einen Dezimalpunkt oder eine exponentielle Zahl mit einem e oder E dargestellt.
Zeichenkette: eine Zeichenkette wird immer zwischen einem doppelten Anführungszeichen (“) dargestellt.
Array: ist eine Liste von Elementen mit gleichen oder verschiedenen Typen, die zwischen
Eckklammern [ ] dargestellt werden.
Objekt: enthält eine durch Komma geteilte, ungeordnete Liste von Eigenschaften, die zwischen geschweiften Klammern { } steht.
JSON Syntax-Regeln
Eigenschaften bestehen aus einem Schlüssel und einem Wert, die durch einen Doppelpunkt getrennt werden. Der Schlüssel sollte eindeutig sein, da es ansonsten zu Problemen führen kann, bei mehrfach vorkommenden Schlüsseln. Der Schlüssel steht immer zwischen einem doppelten Anführungszeichen. Wenn mehrere Daten hintereinander geschrieben werden, dann müssen sie mit einem Komma getrennt werden.
Einzelne JASON Objekte:
{"Sensor": "BME680"}
{"Ort": "Schlafzimmer"}
{"Temperatur": 25}
JASON Objekt mit
mehreren Daten:
{
"Sensor1": {
"Sensorname": "BME680",
"Ort": "Schlafzimmer",
"Temperatur": 25,
"VOC": 85
}
}
JSON Grundlagen Praxis Beispiel
Machen wir zwei Beispiele für die praktische Anwendung von Daten im JSON Format. Dazu benötigen wir die ArduinoJson Library. Zuerst wandeln wir Daten von einem Potenziometer in das JSON Format und im zweiten Beispiel lösen wir das JSON Format wieder in einzelne Variablen auf.
Die Library bietet noch einiges mehr als wir hier behandeln und wenn ihr tiefer in die Materie eingehen wollt, dann könnt ihr das auf dieser Webseite machen: https://arduinojson.org
JSON generieren.
#include
int potpin = 0; //Analog pin A0 für das Potenziometer
StaticJsonDocument<50> doc;
String meinJson;
void setup() {
Serial.begin(115200);
}
void loop() {
meinJson = "";
if (analogRead(potpin)<=500) {
doc["ledRot"] = true;
doc["ledGruen"] = false;
}
else {
doc["ledRot"] = false;
doc["ledGruen"] = true;
}
doc["poti"] = analogRead(potpin);
serializeJson(doc, meinJson);
Serial.println(meinJson);
delay(500);
}
Nach dem Einbinden von der ArduinoJson Library und der Definition vom GPIO – Pin an dem der Poti hängt, wird mit StaticJsonDocument<100> doc; die Speichergrösse für das JSON Dokument mit dem Namen doc definiert. Hier im Beispiel 100 Bytes. Um die genau benötigte Grösse herauszufinden, kann man das mit dem On-line Assistant hier machen: https://arduinojson.org/v6/assistant/. Ihr könnt aber für ein paar Daten einfach 100–200 verwenden, um es einfach zu halten.
In der Loop Funktion überprüfen wir den analogen Wert vom Poti und wenn der gleich oder unter 500 ist, dann beschreiben wir das JSON File. Liegt der Wert darüber, wird das JSON File mit anderen Daten beschrieben. Mit dem Befehl Serial.println(meinJson); wird das JSON File mit den in den Speicher geschriebenen Werten erzeugt.
JSON auflösen.
#include
StaticJsonDocument<100> doc;
String json = "{\"ledRot\":0,\"ledGruen\":1,\"poti\":680}";
void setup() {
Serial.begin(115200);
}
void loop() {
DeserializationError error = deserializeJson(doc, json);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
bool LEDRot = doc["ledRot"];
bool LEDGruen = doc["ledGruen"];
int Poti = doc["poti"];
Serial.println(LEDRot);
Serial.println(LEDGruen);
Serial.println(Poti);
delay(1000);
}
Zuerst erzeugen wir einen JSON String den wir anschliessen auslesen. In der Loop Schleife überprüfen wir, ob ein Fehler anliegt und wenn das der Fall ist, geben wir eine Fehlermeldung aus. Anschließen können wir die Daten auslesen und in unsere Variable schreiben. Hier im Beispiel schreiben wir in die Variable LEDRot vom Datentyp Boolean, den Wert vom JSON File der unter ledRot gespeichert ist. bool LEDRot = doc[“ledRot”];
JSON über MQTT gesendet und ausgewertet
Jetzt senden wir die Poti Daten und den LED-Status im generierten JASON Format vom vorherigen Beispiel über MQTT an unserem Server. Ist der Poti Wert gleich oder unter 500, dann leuchtet die rote LED und die grüne wird ausgeschalten. Liegt der Poti Wert über 500, dann soll die grüne LED angehen und die rote LED ausgeschalten werden.
Für den LED-Aufbau verwenden wir einen Wemos d1 mini und hängen die rote LED über einen 1 kΩ Widerstand an D1 und die grüne LED an D2.
Die JSON Daten werden mittels MQTT zu Node-Red gesendet. Mit dem Node MQTT-in werden sie entgegengenommen, und gleich wieder mit dem Node MQTT-out an den Wemos geleitet.
Der Wemos d1 mini liest die JSON die er über MQTT erhält aus und schalten dann dementsprechend die LEDs aus oder ein.
►Praxis Beispiel Material:
* https://amzn.to/3fzAe0M – Widerstand Set
* https://amzn.to/3oUZ14g – 300 Stk. Leuchtdioden Set 3 und 5 mm
* https://amzn.to/34ifkjS – 180 Stück Taktilen Drucktaster Sortiment
* https://amzn.to/2QQ7JSL – Breadboard Steckbrett mit 830 Kontakten oder
* https://amzn.to/35GcPIp – 3 Stk. Breadboard Steckbrett mit 400 Kontakten
* https://amzn.to/2xeKb2V – Set 3 x 40 STK. je 20 cm M2M/ F2M / F2F
* https://amzn.to/2U7Urmn – NodeMCU ESP8266 ESP-12F
* https://amzn.to/3erQVKq – ESP32 Node-MCU Board
►Relais:
* https://amzn.to/3a5yUjQ – 1 Stk. Relais 5V KY-019 Modul – 10A
* https://amzn.to/2xi4Kvq – 3 Stk. Relais 5V KY-019 Modul – 10A
* https://amzn.to/2U9ZqmL – 5 Stk. Relais 5V KY-019 Modul – 10A
►Netzteile:
* https://amzn.to/3beWY3V – 2er-Pack USB Ladegerät 5V/2A
* https://amzn.to/398WzP9 – Raspberry Pi 4 Netzteil, USB-C, 5.1V, 3A
* https://amzn.to/2wsS8Bh – HomeSpot Netzteil 3A/5V inkl. 1,5M Micro USB Kabel
►Jumper Wire:
* https://amzn.to/2WxKwIl – Female to Female F2F 40 STK. je 20 cm
* https://amzn.to/2xeKb2V – Set 3 x 40 STK. je 20 cm M2M/ F2M / F2F
►Breadboard:
* https://amzn.to/2QQ7JSL – Breadboard Steckbrett mit 830 Kontakten
►USB Kabel:
* https://amzn.to/2y01THN – USB A auf Micro USB Kabel 0.5m
* https://amzn.to/2xkgqgQ – USB auf Mini USB Kabel 0.5m
* https://amzn.to/2QBxCp7 – USB A zu USB B Kabel 0.5m
All links with "*" are Amazon affiliate links. I receive a small portion of the sales when you place an order, at no extra cost to you.
►Node-MCU ESP8266 Board:
* https://amzn.to/2U7Urmn – NodeMCU ESP8266 ESP-12F
* https://amzn.to/2J5wLJ3 – 3er Set, ESP8266 ESP-12F
* https://amzn.to/3belvGd – 5er Set, ESP8266 ESP-12F
►Relais:
* https://amzn.to/3a5yUjQ – 1 Stk. Relais 5V KY-019 Modul – 10A
* https://amzn.to/2xi4Kvq – 3 Stk. Relais 5V KY-019 Modul – 10A
* https://amzn.to/2U9ZqmL – 5 Stk. Relais 5V KY-019 Modul – 10A
►Netzteile:
* https://amzn.to/3beWY3V – 2er-Pack USB Ladegerät 5V/2A
* https://amzn.to/398WzP9 – Raspberry Pi 4 Netzteil, USB-C, 5.1V, 3A
* https://amzn.to/2wsS8Bh – HomeSpot Netzteil 3A/5V inkl. 1,5M Micro USB Kabel
►Jumper Wire:
* https://amzn.to/2WxKwIl – Female to Female F2F 40 STK. je 20 cm
* https://amzn.to/2xeKb2V – Set 3 x 40 STK. je 20 cm M2M/ F2M / F2F
►Breadboard:
* https://amzn.to/2QQ7JSL – Breadboard Steckbrett mit 830 Kontakten
►USB Kabel:
* https://amzn.to/2y01THN – USB A auf Micro USB Kabel 0.5m
* https://amzn.to/2xkgqgQ – USB auf Mini USB Kabel 0.5m
* https://amzn.to/2QBxCp7 – USB A zu USB B Kabel 0.5m
All links with "*" are Amazon affiliate links. I receive a small portion of the sales when you place an order, at no extra cost to you.