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
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?
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.
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.
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.
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
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...