V ideálním případě byste použili správný rekurzivní analyzátor JSON, jako je ten, který je navržen v odpovědi prakharsingh95. Pokud je však rychlost a velikost kódu kritickým hlediskem a pokud je formát odpovědi omezen, pak můžete vytvořit rychlý analyzátor pro speciální účely.
Zde je jednoduchý příklad. Předpokládá, že odpověď byla uložena v poli response
char:
static const char key [] = "\" action_status \ ""; const char * p, * q; char action_status [16]; for (p = response;; p = q) {p = strstr (p, key); // najít klíč if (! p) break; // nenalezeno p = strchr (p, ':'); // najít ':' mezi klíčem a hodnotou p = strchr (p, '"'); // najít úvodní uvozovky pro hodnotu q = strchr (p + 1, '"'); // najít závěrečné uvozovky // nahlásit nález. strncpy (action_status, p + 1, q-p-1); action_status [q-p-1] = '\ 0'; Serial.print ("Stav nalezené akce:"); Serial.println (action_status);}
V produkčním kódu byste samozřejmě zkontrolovali, že každé volání strchr
vrátí ukazatel, který nemá hodnotu NULL. A zkontrolovali byste, že nalezený stav zapadá do vaší vyrovnávací paměti.
Upravit o výhodách a nevýhodách této metody:
Ve srovnání se správným analyzátorem JSON , tento přístup vám poskytne menší a rychlejší kód, nevýhodou je, že je více křehký . Například to nezjistí poškozený JSON a vrátí odpadky, pokud theaction_status bude místo čísla řetězec nebo bude ohromen vloženými uvozovkami, nebo pokud se řetězec „action_status“ zobrazí jako hodnota nějakého jiného pole ... Úplný analyzátor JSON by měl správně zvládnout všechny tyto případy.
Na počítači bez vestavby by byl správný analyzátor JSON pravděpodobně jedinou vhodnou odpovědí. V omezeném prostředí mikrokontroléru musíte někdy provést kompromisy. V tomto konkrétním případě „nejlepší“ odpověď závisí na tom, kolik vážíte rychlosti a velikosti vs.
robustnost proti neočekávaným vstupům.