Saya mengetahui beberapa parsing JSON untuk Arduino.
Saya tidak pernah menggunakan ini tetapi saya melakukan beberapa JSON sederhana parsing dalam proyek yang sedang saya kerjakan jadi saya akan menunjukkan kepada Anda bagaimana saya melakukannya.
CATATAN: Saya membaca data serial menggunakan pustaka serial perangkat lunak. Anda harus mengubah kode ini agar bekerja untuk Anda. Ini hanya akan bekerja pada string JSON yang sangat sederhana. Ini sangat terbatas tetapi jika hanya itu yang Anda parsing maka itu akan berhasil.
Contoh respons JSON dari server:
{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}
Pertama, hanya baca data antara kurung kurawal.
String response = "";
bool begin = false;
while (SIM900.available() || !begin) {
char in = SIM900.read();
if (in == '{') {
begin = true;
}
if (begin) response += (in);
if (in == '}') {
break;
}
delay(1);
}
Kode ini membaca data satu byte pada satu waktu dan setelah mendapat tanda kurung terbuka, ia mulai menyimpannya response
. Ketika mendapat penjepit penutup, itu mengakhirinya. Jadi, inilah batasan yang jelas, Anda hanya dapat memiliki satu set kawat pembuka / penutup pada string Anda.
Setelah saya memiliki string, saya menggunakan indexOf
dan substring
untuk mengekstrak informasi yang relevan:
start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);
Kode ini diset start
ke awal id":"
+ 5 karakter dalam string. Ini +5 karena itu berapa lama id":"
. Jadi start
menunjuk ke TEST1
dalam string JSON. Dalam sistem saya, ID akan selalu sepanjang 5 karakter, jadi pada akhirnya start + 5
. Saya kemudian gunakan substring
untuk mengekstraknya.
Sekali lagi, sebelum ada yang mulai memilih saya untuk solusi mengerikan ini: jika Anda tahu persis apa yang Anda kerjakan, dan memahami keterbatasan kode ini, maka ini bukan solusi yang buruk. Ini solusi yang menyelesaikan pekerjaan.
String
penggunaannya tidak membuat situasi memori lebih buruk (ya,String
di Arduino adalah kesayangan saya).Saya telah memprogram kelas yang akan menerima char dengan char dokumen JSON. Ini hanya akan menyimpan dalam memori beberapa byte untuk struktur JSON yang diketahui menggunakan mesin negara dan hasil yang Anda butuhkan. Jadi, Anda dapat meminta kelas untuk hasil yang Anda inginkan dan akan memproses JSON.
Ideal untuk tujuan Anda. Saya telah menggunakan untuk menghubungkan ke layanan cuaca yang mengembalikan json:
Periksa posting blog ini yang baru saja saya tulis: http://web.biicode.com/blog/big-json-on-arduino .
Kode sumber ada di sini di Biicode.
sumber
Saya menulis parser untuk PIC yang menggunakan ram sangat rendah karena ia bekerja langsung dengan pointer char dan tidak membangun struktur pohon. Jika Anda meminta untuk mendapatkan item N dari daftar, itu memberi Anda pointer aktual ke file JSON langsung tepat di awal item N dari daftar. Kemudian Anda dapat menanyakan jenis objek yang diwakili oleh pointer, dll. Ini buggy dan tidak mendukung float dan saya pikir memiliki beberapa batasan lain (sudah lama sekali) tetapi semuanya ada di github: https://github.com / EternityForest / OpenFortune-fortune-like-text-generator Anda harus mencari di libfortune yang merupakan bagian dari versi C.
sumber
Saya menulis pustaka JSON-RPC sederhana (di atas aJson) dengan contoh cara menghidupkan dipimpin dengan panggilan prosedur JSON-RPC:
sumber