Otázka:
Ukládání a analýza dat pomocí Arduina
FunKction
2015-06-03 19:30:56 UTC
view on stackexchange narkive permalink

K získání dat ze serveru ve formátu JSON používám ethernetový štít a Arduino. Požadavek vypadá takto:

  client.println ("ZÍSKEJTE http: //ramp.local/api/actions?");  

Odpověď I get je:

  [{"action_id": 1, "action_type": "up", "action_status": "new", "ramp_id": 31, "user_id": 17}, {"action_id": 2, "action_type": "down", "action_status": "new", "ramp_id": 32, "user_id": 20}, {"action_id": 3, "action_type": "nahoru" , "action_status": "completed", "ramp_id": 32, "user_id": 17}, {"action_id": 4, "action_type": "up", "action_status": "failed", "ramp_id": 31 , "user_id": 17}] 

Jak shromáždit data v řetězcové proměnné a analyzovat je, aby získal action_status ?

Tři odpovědi:
Edgar Bonet
2015-06-03 19:56:41 UTC
view on stackexchange narkive permalink

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.

ps95
2015-06-04 19:15:33 UTC
view on stackexchange narkive permalink

Doporučil bych knihovnu pro analýzu JSON. Pokladna https://github.com/bblanchon/ArduinoJson

  var response = []; // získat odpověď zde response_length = 4; // Sem vložte délku pole odpovědíStaticJsonBuffer<200> jsonBuffer; String action_ids [] = new String [response_length]; String action_types [] = new String [response_length]; String action_statuses [] = new String [response_length]; [String ramp_id] String [response_length]; String user_ids [] = new String [response_length]; for (int i = 0; i < response_length; i ++) {JsonObject& data = jsonBuffer.parseObject (response [i]); // Všimněte si „&“ výše action_ids [i] = data ["action_id"]; action_types [i] = data ["action_type"]; action_statuses [i] = data ["action_status"]; ramp_ids [i] = data ["ramp_id"]; user_ids [i] = data ["user_id"];}  

Samozřejmě vám stačí rozbalit pouze ta pole, která potřebujete.

Vítejte v Arduino SE! Nezneužívejte funkce úprav našeho webu zbytečnými úpravami a vrácením změn. Abychom zabránili zneužití této funkce úprav, uzamkl jsem tuto odpověď na týden; po této době budete moci svou odpověď znovu upravit. Děkujeme za vaši spolupráci a neváhejte odpovědět na jakékoli dotazy.
Matt Clark
2015-06-04 19:22:54 UTC
view on stackexchange narkive permalink

Vyzkoušejte velikost.

Toto je arduino otevřený zdrojový procesor JSON.



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...