ESP8266: JSON Daten decodieren ?

Gast #6513466
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
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
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.
Gast
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
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.
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
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
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

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.