ESP8266: JSON Daten decodieren ?

Gast #6513466
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
Angehängte Dateien:
Gast #6513570
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?
Gast #6513579
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.
Gast #6513589
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.
#6513598
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.
Gast #6513625
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
Gast #6513976
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren