Мне известно о нескольких библиотеках JSON для Arduino.
Я никогда не использовал ничего из этого, но я выполнил простой анализ JSON в проекте, над которым я работаю, поэтому я покажу вам, как я это сделал.
ПРИМЕЧАНИЕ: я читаю последовательные данные, используя программную библиотеку последовательных программ Вам нужно изменить этот код, чтобы работать на вас. Это будет работать только на очень простых строках JSON. Это очень ограничено, но если это все, что вы анализируете, то это сработает.
Пример ответа JSON от сервера:
{"id":"TEST1","lat":"38.56050207","lng":"-121.42158374","total":"3","available":"2"}
Во-первых, только читать данные между фигурными скобками.
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);
}
Этот код читает данные по одному байту за раз, и как только он получает открытую скобку, он начинает сохранять их в response
. Когда он получает закрывающую скобку, он заканчивает это. Итак, вот четкое ограничение: в вашей строке может быть только один набор открывающих / закрывающих скобок.
Получив строку, я использую indexOf
и substring
для извлечения соответствующей информации:
start = response.indexOf("id\":\"") + 5;
end = start + 5;
nodeId = response.substring(start, end);
Этот код устанавливает start
начало id":"
+ 5 символов в строке. Это +5, потому что так долго id":"
. Так start
указывает на TEST1
в строке JSON. В моей системе идентификатор всегда будет длиной 5 символов, так что конец есть start + 5
. Затем я использую, substring
чтобы извлечь это.
Опять же, прежде чем кто-то начнет голосовать за меня за это ужасное решение: если вы точно знаете, с чем работаете, и понимаете ограничения этого кода, то это не плохое решение. Это решение, которое выполняет свою работу.
String
использование не ухудшает ситуацию с памятью (да,String
в Arduino моя любимая мозоль).Я запрограммировал класс, который будет получать char by char документ JSON. Он сохранит в памяти только несколько байтов для известной структуры JSON, используя конечный автомат и результаты, которые вам нужны. Таким образом, вы можете запросить у класса необходимые результаты и обработать JSON.
Это идеально подходит для ваших целей. Я использовал для подключения к службе погоды, которая возвращает JSON:
Посмотрите этот пост в блоге, который я только что написал: http://web.biicode.com/blog/big-json-on-arduino .
Исходный код здесь, в Biicode.
источник
Я написал парсер для PIC, который использует очень мало оперативной памяти, потому что он работает напрямую с указателями на символы и не создает древовидную структуру. Если вы просите получить элемент N списка, он дает вам фактический указатель на прямой файл JSON в начале элемента N списка. Затем вы можете спросить, какой тип объекта представляет указатель и т. Д. Он глючит и не поддерживает float, и я думаю, что имеет несколько других ограничений (это было давно), но все это на github: https://github.com / EternityForest / OpenFortune-fortune-like-text-generator Вам нужно взглянуть на libfortune, которая является частью C-версии.
источник
Я написал простую библиотеку JSON-RPC (поверх aJson) с примером того, как включить светодиод с помощью вызова процедуры JSON-RPC:
источник