ArduinoJsonParser.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * malloc-free JSON parser for Arduino
  3. * Benoit Blanchon 2014
  4. * MIT License
  5. */
  6. #ifndef __ARDUINOJSONPARSER_H
  7. #define __ARDUINOJSONPARSER_H
  8. #include <Arduino.h>
  9. #include "utility/jsmn.h"
  10. template <int N>
  11. class ArduinoJsonParser
  12. {
  13. public:
  14. ArduinoJsonParser()
  15. {
  16. jsmn_init(&parser);
  17. }
  18. boolean parse(char* jsonString)
  19. {
  20. buffer = jsonString;
  21. int tokenCount = sizeof(tokens) / sizeof(tokens[0]);
  22. if (JSMN_SUCCESS != jsmn_parse(&parser, jsonString, tokens, tokenCount))
  23. return false;
  24. // Add null termination to each token
  25. for (int i = 0; i < tokenCount; i++)
  26. {
  27. buffer[tokens[i].end] = 0;
  28. }
  29. return true;
  30. }
  31. char* getValue(char* name)
  32. {
  33. // Scan each keys, every two other token
  34. // (skip index 0, because it's the whole json object)
  35. for (int i = 1; i < 2 * N; i += 2)
  36. {
  37. // Early break if we reach the last token
  38. if (i >= parser.toknext) break;
  39. // Get key token string
  40. char* key = buffer + tokens[i].start;
  41. // Compare with desired name
  42. if (strcmp(name, key) == 0)
  43. {
  44. return buffer + tokens[i + 1].start;
  45. }
  46. }
  47. }
  48. private:
  49. char* buffer;
  50. jsmn_parser parser;
  51. jsmntok_t tokens[N * 2 + 1];
  52. };
  53. #endif