ArduinoJsonParser.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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 JsonArray;
  33. class JsonHashTable : public JsonObjectBase
  34. {
  35. friend class JsonParserBase;
  36. public:
  37. JsonHashTable()
  38. {
  39. }
  40. char* getString(char* key)
  41. {
  42. jsmntok_t* token = getToken(key);
  43. return token != NULL ? json + token->start : NULL;
  44. }
  45. JsonArray getArray(char* key);
  46. private:
  47. JsonHashTable(char* json, jsmntok_t* tokens)
  48. : JsonObjectBase(json, tokens)
  49. {
  50. }
  51. jsmntok_t* getToken(char* key);
  52. };
  53. class JsonArray : public JsonObjectBase
  54. {
  55. friend class JsonParserBase;
  56. friend class JsonHashTable;
  57. public:
  58. public:
  59. JsonArray()
  60. {
  61. }
  62. char* getString(int index);
  63. int getLength()
  64. {
  65. return tokens != NULL ? tokens[0].size : 0;
  66. }
  67. private:
  68. JsonArray(char* json, jsmntok_t* tokens)
  69. : JsonObjectBase(json, tokens)
  70. {
  71. }
  72. };
  73. class JsonParserBase
  74. {
  75. public:
  76. JsonArray parseArray(char* json)
  77. {
  78. if (!parse(json) || tokens[0].type != JSMN_ARRAY)
  79. return JsonArray();
  80. return JsonArray(json, tokens);
  81. }
  82. JsonHashTable parseHashTable(char* json)
  83. {
  84. if (!parse(json) || tokens[0].type != JSMN_OBJECT)
  85. return JsonHashTable();
  86. return JsonHashTable(json, tokens);
  87. }
  88. protected:
  89. JsonParserBase(jsmntok_t* tokens, int maxTokenCount)
  90. {
  91. this->maxTokenCount = maxTokenCount;
  92. this->tokens = tokens;
  93. jsmn_init(&parser);
  94. }
  95. bool parse(char* json);
  96. /*
  97. char* getValueByIndex(int index);
  98. char* getValueByKey(char* name);
  99. int getArraySize();
  100. */
  101. private:
  102. char* buffer;
  103. jsmn_parser parser;
  104. int maxTokenCount;
  105. jsmntok_t* tokens;
  106. };
  107. template <int N>
  108. class JsonParser : public JsonParserBase
  109. {
  110. public:
  111. JsonParser()
  112. : JsonParserBase(tokens, N)
  113. {
  114. }
  115. private:
  116. jsmntok_t tokens[N];
  117. };
  118. /*
  119. template <int N>
  120. class JsonArrayParser : public JsonParserBase
  121. {
  122. public:
  123. JsonArrayParser()
  124. : JsonParserBase(tokens, N + 1)
  125. {
  126. }
  127. bool parse(char* json)
  128. {
  129. return parseAndCheckType(json, JSMN_ARRAY);
  130. }
  131. int getCount()
  132. {
  133. return getArraySize();
  134. }
  135. char* getValue(int index)
  136. {
  137. return getValueByIndex(index);
  138. }
  139. private:
  140. jsmntok_t tokens[N + 1];
  141. };
  142. */
  143. #endif