質問:
Arduinoを使用したデータの保存と解析
FunKction
2015-06-03 19:30:56 UTC
view on stackexchange narkive permalink

イーサネットシールドとArduinoを使用して、サーバーからJSON形式でデータを取得します。リクエストは次のようになります:

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

レスポンスI get is:

  [{"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": "up" 、 "action_status": "completed"、 "ramp_id":32、 "user_id":17}、{"action_id":4、 "action_type": "up"、 "action_status": "failed"、 "ramp_id":31 、 "user_id":17}]  

文字列変数にデータを収集し、それを解析して action_status を取得するにはどうすればよいですか?

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

理想的には、prakharsingh95の回答で提案されているような、適切な再帰JSONパーサーを使用します。ただし、コードの速度とサイズが重要な考慮事項であり、応答の形式が狭く制限されている場合は、高速な専用パーサーを作成できます。

これは簡単な例です。応答が 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); //キーを見つけるif(!p)break; //見つかりません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 = []; //ここで応答を取得します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 lamp_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"];ランプID [i] =データ["ランプID"]; user_ids [i] = data ["user_id"];}  

もちろん、必要なフィールドを抽出するだけで済みます。

Arduino SEへようこそ!余分な編集やロールバックによって当サイトの編集機能を乱用しないでください。ここでの編集機能の誤用を防ぐために、私はこの回答を1週間ロックしました。この時間の後、回答を再度編集できるようになります。ご協力ありがとうございました。ご不明な点がございましたら、お気軽にお問い合わせください。
Matt Clark
2015-06-04 19:22:54 UTC
view on stackexchange narkive permalink

サイズを試してみてください。

これは、arduinoベースのオープンソースのJSONプロセッサです。



このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 3.0ライセンスに感謝します。
Loading...