ArduinoJsonParser.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. class JsonParserBase
  11. {
  12. public:
  13. protected:
  14. JsonParserBase(jsmntok_t* tokens, int maxTokenCount)
  15. {
  16. this->maxTokenCount = maxTokenCount;
  17. this->tokens = tokens;
  18. jsmn_init(&parser);
  19. }
  20. int getTokenCount()
  21. {
  22. return parser.toknext - 1;
  23. }
  24. bool parseAndCheckType(char* json, jsmntype_t type);
  25. char* getValueByIndex(int index);
  26. char* getValueByKey(char* name);
  27. int getArraySize();
  28. private:
  29. int getNestedTokenCounts(int tokenIndex);
  30. char* buffer;
  31. jsmn_parser parser;
  32. int maxTokenCount;
  33. jsmntok_t* tokens;
  34. };
  35. template <int N>
  36. class JsonObjectParser : public JsonParserBase
  37. {
  38. public:
  39. JsonObjectParser()
  40. : JsonParserBase(tokens, N + 1)
  41. {
  42. }
  43. bool parse(char* json)
  44. {
  45. return parseAndCheckType(json, JSMN_OBJECT);
  46. }
  47. char* getValue(char* name)
  48. {
  49. return getValueByKey(name);
  50. }
  51. private:
  52. jsmntok_t tokens[N + 1];
  53. };
  54. template <int N>
  55. class JsonArrayParser : public JsonParserBase
  56. {
  57. public:
  58. JsonArrayParser()
  59. : JsonParserBase(tokens, N + 1)
  60. {
  61. }
  62. bool parse(char* json)
  63. {
  64. return parseAndCheckType(json, JSMN_ARRAY);
  65. }
  66. int getCount()
  67. {
  68. return getArraySize();
  69. }
  70. char* getValue(int index)
  71. {
  72. return getValueByIndex(index);
  73. }
  74. private:
  75. jsmntok_t tokens[N + 1];
  76. };
  77. #endif