Forum: Mikrocontroller und Digitale Elektronik ESP8266: JSON Daten decodieren ?


von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Moin,

anbei mal er formatierte Text einer JSON Abfrage meines AccuWeather 
Accounts.
Grundsätzlich ist mit JSON mit Arduino klar, bloss nicht wie ich an die 
Objekte komme? D.h. welche Befehle brauche ich nach dem Decodieren?

Beispiel aus dem Text:

"Temperature":{
            "Minimum":{
               "Value":5.8,
               "Unit":"C",
               "UnitType":17

ich will an die Temperatur Einheit, also "C".

Wie komme ich da dran? Es gibt so Dinge wie root["main"]["temp"]) aber 
wie ist die Struktur dieser Klammer-Geschichten? JSON Datensätze können 
beliebige Tiefen haben?

Könnte das mal jemand verständlich erklären? Was hat es mit dem root auf 
sich? Muss man da eine "Wurzel" setzen? Binäre Bäume kenne ich ja, ein 
JSON Datensatz ist nichts anderes.

Grüße,
Christian

von Klaus R. (klara)


Lesenswert?

Christian J. schrieb:
> welche Befehle brauche ich nach dem Decodieren?

Was willst Du denn dekodieren? Der Text ist doch nicht verschlüsselt.
mfg Klaus

von leo (Gast)


Lesenswert?

Christian J. schrieb:
> Grundsätzlich ist mit JSON mit Arduino klar, bloss nicht wie ich an die
> Objekte komme?

Also nicht.

Hast du mals "arduino json" gesucht:
e.g. https://github.com/bblanchon/ArduinoJson

leo

von Stefan F. (Gast)


Lesenswert?

Wenn wir von Arduino reden, dann denke ich in erster Linie an einen 
ATmega328, nicht an einen Mikrocontroller mit zig kB Programmspeicher 
und RAM.

Insofern habe ich doch ernsthafte Bedenken gegen einen vollwertigen JSON 
Parser.

Man kann auch einfach dein Input Zeilenweise lesen und nach

> "Unit":"

Der String dahinter bis zu den nächsten Anführungsstrichen ist dann der 
Value. Ja ich weiß, damit kann man noch lange nicht jedes beliebige JSON 
Format einlesen, aber das verlangt auch niemand, oder?

von Christian J. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Insofern habe ich doch ernsthafte Bedenken gegen einen vollwertigen JSON
> Parser.

Der kann aber problemlos laufen auf einer 32 Bit CPU. Wenn dann richtig! 
Klappt ja auch, nur habe ich das abgeschrieben, ohne es wirklich zu 
verstehen.

von Christian J. (Gast)


Lesenswert?

leo schrieb:
> Also nicht.
>
> Hast du mals "arduino json" gesucht:
> e.g. https://github.com/bblanchon/ArduinoJson

Ich möchte nur wissen, wie sich die Hierarchie einer JSON Struktur in 
den ganzen Klammerebenen abbildet? Ich habe schon viel gelesen, ohne es 
zu kapieren! Eine ganze einfache Kiste ist das hier, bloss eine Ebene. 
Aber vieles hat erheblich mehr Ebenen!

const char* sensor = doc["sensor"];
long time          = doc["time"];
double latitude    = doc["data"][0];
double longitude   = doc["data"][1];

es gibt nämlich noch so Sachen wie doc["sensor"][3]["sensor_n] usw. 
Bloss wie weiss man das? Gibt der Parser eine Struktur aus? Der parst ja 
beliebige Inhalte und legt sie "irgendwie" ab und erst danach kann man 
sie auslesen. Nur muss man ja irgendwie rauskriegen, wie man das macht.

von leo (Gast)


Lesenswert?

Christian J. schrieb:
> Bloss wie weiss man das?

Dumpen oder einfach zaehlen.
https://www.geeksforgeeks.org/json-dump-in-python/

leo

von Christian J. (Gast)


Lesenswert?

Komme ich nicht mit klar so...

doc: the JsonDocument that will store the memory representation of the 
MessagePack document.

Nett geschrieben.... aber da steht nirgendwo WIE das abgelegt wird! 
Klar, irgendeine Baumstruktur wird das sein... aber ich will deren 
Geometrie wissen bevor ich irgendwas auslese und dann wie ich an ein 
Element rankomme, was tief drin ist.

Wenn alles nicht hilft probiere ich es einfach aus, Trial&Error, 
Comoilerfehler oder das Richtige steht irgendwann drin. Nur ist das 
leider die Methode wie ich mein erstes Projekt gemacht habe. Irgendwas 
kopiert, verändert, herum gedoktort und dann lief es. Nur warum es das 
tut verstehe ich nicht wirklich.

von Oliver S. (phetty)


Lesenswert?

Es gibt in ArduinoJson eine Funktion deserializeJson(jsnstrg, msgString)

Die erste Variable wird im Header definiert als Json-Objekt:
StaticJsonDocument<200> jsnstrg;

In der zweiten (msgString) liegt der Payload vom mqtt.

Mit
deserializeJson(jsnstrg, msgString)

werden der json zerlegt und kann dann über:

temp1 = jsnstrg["sensor"];

gezogen werden.

In den Beispielen von ArduinoJson sind auch einige dabei für etwas 
verschachteltere Objekte.

von Arno (Gast)


Lesenswert?

Lies dir das durch: https://arduinojson.org/v6/doc/

Ist leider auf der Startseite erst nach gefühlten 100 anderen Boxen mit 
Eigenwerbung zu finden.

Und ja, JSON kann soweit ich weiß beliebig tief verschachtelt sein. Und 
ohne zu wissen, wie die Daten in dem JSON eingetragen werden, wirst du 
auch keine Chance haben, sie wieder heraus zu bekommen.

MfG, Arno

von c-hater (Gast)


Lesenswert?

Christian J. schrieb:

> Der kann aber problemlos laufen auf einer 32 Bit CPU.

Wieviel Bit Verarbeitungsbreite die CPU hat, spielt für die Aufgabe, 
einen JSON-Parser zu konstruieren, absolut keine Rolle, da die 
allermeisten Operationen sowieso nur mit 8 Bit Breite erfolgen.

Das einzige, was wirklich wichtig ist, ist die Menge an verfügbarem RAM, 
denn allein diese begrenzt die mögliche Komplexität des JSON.

Der Algorithmus ist übrigens ziemlich trivial, JSON wurde ja schließlich 
extra dafür konstruiert, sich möglichst einfach parsen zu lassen. Sonst 
hätte man ja auch gleich bei XML bleiben können...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.