ArduinoJsonParser.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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 JsonObjectBase
  11. {
  12. public:
  13. JsonObjectBase()
  14. {
  15. json = NULL;
  16. tokens = NULL;
  17. }
  18. bool success()
  19. {
  20. return json != NULL && tokens != NULL;
  21. }
  22. protected:
  23. JsonObjectBase(char* json, jsmntok_t* tokens)
  24. {
  25. this->json = json;
  26. this->tokens = tokens;
  27. }
  28. int getNestedTokenCounts(int tokenIndex);
  29. char* json;
  30. jsmntok_t* tokens;
  31. };
  32. class JsonHashTable : public JsonObjectBase
  33. {
  34. friend class JsonParserBase;
  35. public:
  36. JsonHashTable()
  37. {
  38. }
  39. char* getString(char* key);
  40. private:
  41. JsonHashTable(char* json, jsmntok_t* tokens)
  42. : JsonObjectBase(json, tokens)
  43. {
  44. }
  45. };
  46. class JsonParserBase
  47. {
  48. public:
  49. JsonHashTable parseHashTable(char* json)
  50. {
  51. if (!parse(json) || tokens[0].type != JSMN_OBJECT)
  52. return JsonHashTable();
  53. return JsonHashTable(json, tokens);
  54. }
  55. protected:
  56. JsonParserBase(jsmntok_t* tokens, int maxTokenCount)
  57. {
  58. this->maxTokenCount = maxTokenCount;
  59. this->tokens = tokens;
  60. jsmn_init(&parser);
  61. }
  62. bool parse(char* json);
  63. /*
  64. char* getValueByIndex(int index);
  65. char* getValueByKey(char* name);
  66. int getArraySize();
  67. */
  68. private:
  69. char* buffer;
  70. jsmn_parser parser;
  71. int maxTokenCount;
  72. jsmntok_t* tokens;
  73. };
  74. template <int N>
  75. class JsonParser : public JsonParserBase
  76. {
  77. public:
  78. JsonParser()
  79. : JsonParserBase(tokens, N)
  80. {
  81. }
  82. private:
  83. jsmntok_t tokens[N];
  84. };
  85. /*
  86. template <int N>
  87. class JsonArrayParser : public JsonParserBase
  88. {
  89. public:
  90. JsonArrayParser()
  91. : JsonParserBase(tokens, N + 1)
  92. {
  93. }
  94. bool parse(char* json)
  95. {
  96. return parseAndCheckType(json, JSMN_ARRAY);
  97. }
  98. int getCount()
  99. {
  100. return getArraySize();
  101. }
  102. char* getValue(int index)
  103. {
  104. return getValueByIndex(index);
  105. }
  106. private:
  107. jsmntok_t tokens[N + 1];
  108. };
  109. */
  110. #endif