題:
使用Arduino存儲和解析數據
FunKction
2015-06-03 19:30:56 UTC
view on stackexchange narkive permalink

我使用Ethernet Shield和Arduino以JSON格式從服務器獲取數據。請求看起來像這樣:

  client.println(“ GET http://ramp.local/api/actions?”);  

響應我get is:

  [{“ action_id”:1,“ action_type”:“ up”,“ action_status”:“ new”,“ ramp_id”:31,“ user_id”:17}, {“ action_id”:2,“ action_type”:“向下”,“ action_status”:“新”,“ ramp_id”:32,“ user_id”:20},{“ action_id”:3,“ action_type”:“向上” ,“ action_status”:“已完成”,“ ramp_id”:32,“ user_id”:17},{“ action_id”:4,“ action_type”:“ up”,“ action_status”:“失敗”,“ ramp_id”:31 ,“ user_id”:17}]  

如何在字符串變量中收集數據並進行解析以獲取 action_status

三 答案:
Edgar Bonet
2015-06-03 19:56:41 UTC
view on stackexchange narkive permalink

理想情況下,您將使用適當的遞歸JSON解析器,如prakharsingh95的答案中所建議的那樣。但是,如果代碼速度和大小是關鍵考慮因素,並且響應的格式沒有受到嚴格限制,那麼您可以構建一個快速的專用解析器。

這裡是一個簡單的示例。假定響應已存儲在 response char數組中:

 靜態const char key [] =“ \” action_status \“”; const char * p,* q; char action_status [16]; for(p =響應;; p = q){p = strstr(p,key); //如果(!p)中斷則查找密鑰//找不到p = strchr(p,':'); //找到鍵和值之間的':'p = strchr(p,'“'); //找到值q = strchr(p + 1,'”');的開頭引號//查找右引號//報告查找。 strncpy(action_status,p + 1,q-p-1); action_status [q-p-1] ='\ 0'; Serial.print(“已發現操作狀態:”); Serial.println(action_status);}  

當然,在生產代碼中,您將檢查每個 strchr 調用是否返回非NULL指針。然後,您將檢查找到的狀態是否適合您的緩衝區。

編輯此方法的優缺點:

與適當的JSON解析器比較,這種方法將為您提供更小,更快的代碼,缺點是易碎。例如,這不會檢測到損壞的JSON,並且如果action_status恰好是數字而不是字符串,或者是帶有嵌入式雙引號的字符串,或者如果字符串“ action_status”出現為其他值,則它將返回垃圾。字段...完整的JSON解析器應正確處理所有這些情況。

在非嵌入式計算機上,正確的JSON解析器可能是唯一合適的答案。在受限的微控制器環境中,有時必須權衡取捨。在這種特定情況下,“最佳”答案取決於您的體重速度和大小與體重的多少。 針對意外輸入的魯棒性。

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

我建議使用JSON解析庫。結帳 https://github.com/bblanchon/ArduinoJson

  var response = []; //獲取響應heret response_length = 4; //在此處放入響應數組的長度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_ids [] = new String [response_length]; String user_ids [] = new String [response_length]; for(int i = 0; i < response_length; i ++){JsonObject& data = jsonBuffer.parseObject(response [i]); //注意action_ids [i] = data [“ action_id”];上方的“ &”; action_types [i] = data [“ action_type”]; action_statuses [i] = data [“ action_status”]; ramp_ids [i] =數據[“ ramp_id”]; user_ids [i] = data [“ user_id”];}  

當然,您只需要提取所需的字段即可。

歡迎使用Arduino SE!請不要通過多餘的編輯和回滾濫用我們網站的編輯功能。為了防止濫用此處的編輯功能,我已將此答案鎖定了一周。在這段時間之後,您將可以再次編輯答案。感謝您的合作,如有任何疑問,請隨時答复。
Matt Clark
2015-06-04 19:22:54 UTC
view on stackexchange narkive permalink

試穿以獲取尺寸。

這是基於arduino的開源JSON處理器。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...