Tôi biết một vài thư viện phân tích cú pháp JSON cho Arduino.
Tôi chưa bao giờ sử dụng bất kỳ thứ nào trong số này nhưng tôi đã thực hiện một số phân tích cú pháp JSON đơn giản trong một dự án tôi đang thực hiện vì vậy tôi sẽ chỉ cho bạn cách tôi đã làm điều đó.
LƯU Ý: Tôi đang đọc dữ liệu nối tiếp bằng thư viện nối tiếp phần mềm. Bạn sẽ cần thay đổi mã này để làm việc cho bạn. Điều này sẽ chỉ hoạt động trên các chuỗi JSON rất đơn giản. Nó rất hạn chế nhưng nếu đó là tất cả những gì bạn đang phân tích thì nó sẽ hoạt động.
Ví dụ về phản hồi JSON từ máy chủ:
{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}
Đầu tiên, chỉ đọc dữ liệu giữa các dấu ngoặc nhọn.
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);
}
Mã này đọc dữ liệu một byte mỗi lần và một khi nó có được một dấu ngoặc mở, nó bắt đầu lưu nó vào response
. Khi nó có được một cú đúp kết thúc, nó kết thúc nó. Vì vậy, đây là một giới hạn rõ ràng, bạn chỉ có thể có một bộ dấu ngoặc đóng / mở trong chuỗi của mình.
Khi tôi có chuỗi, tôi sử dụng indexOf
và substring
trích xuất thông tin liên quan:
start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);
Mã này đặt start
ở đầu id":"
+ 5 ký tự trong chuỗi. Đó là +5 vì đó là bao lâu id":"
. Vì vậy, start
trỏ đến TEST1
trong chuỗi JSON. Trong hệ thống của tôi, ID luôn dài 5 ký tự nên cuối cùng là vậy start + 5
. Sau đó tôi sử dụng substring
để giải nén điều đó.
Một lần nữa, trước khi bất cứ ai bắt đầu bỏ phiếu cho tôi về giải pháp khủng khiếp này: nếu bạn biết chính xác những gì bạn đang làm việc và hiểu những hạn chế của mã này, thì đây không phải là một giải pháp tồi. Đó là một giải pháp hoàn thành công việc.