ArduinoJsonParser.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * malloc-free JSON parser for Arduino
  3. * Benoit Blanchon 2014
  4. * MIT License
  5. */
  6. #include "ArduinoJsonParser.h"
  7. int JsonParserBase::getNestedTokenCounts(int tokenIndex)
  8. {
  9. int count = 0;
  10. for (int i = 0; i < tokens[tokenIndex].size; i++)
  11. {
  12. count += 1 + getNestedTokenCounts(tokenIndex + 1 + i);
  13. }
  14. return count;
  15. }
  16. bool JsonParserBase::parseAndCheckType(char* jsonString, jsmntype_t type)
  17. {
  18. buffer = jsonString;
  19. if (JSMN_SUCCESS != jsmn_parse(&parser, jsonString, tokens, maxTokenCount))
  20. return false;
  21. if (tokens[0].type != type)
  22. return false;
  23. // Add null termination to each token
  24. for (int i = 1; i < parser.toknext; i++)
  25. {
  26. buffer[tokens[i].end] = 0;
  27. // skip nested objects
  28. i += getNestedTokenCounts(i);
  29. }
  30. return true;
  31. }
  32. char* JsonParserBase::getValueByKey(char* name)
  33. {
  34. // Scan each keys, every two other token
  35. // (skip index 0, because it's the whole json object)
  36. for (int i = 1; i < parser.toknext; i += 2)
  37. {
  38. // Get key token string
  39. char* key = buffer + tokens[i].start;
  40. // Compare with desired name
  41. if (strcmp(name, key) == 0)
  42. {
  43. return buffer + tokens[i + 1].start;
  44. }
  45. // skip nested objects
  46. i += getNestedTokenCounts(i);
  47. }
  48. }
  49. char* JsonParserBase::getValueByIndex(int index)
  50. {
  51. for (int i = 1; i < parser.toknext; i++)
  52. {
  53. if (index == 0)
  54. {
  55. return buffer + tokens[i].start;
  56. }
  57. // skip nested objects
  58. i += getNestedTokenCounts(i);
  59. index--;
  60. }
  61. return NULL;
  62. }
  63. int JsonParserBase::getArraySize()
  64. {
  65. int size = 0;
  66. for (int i = 1; i < parser.toknext; i++)
  67. {
  68. // skip nested objects
  69. i += getNestedTokenCounts(i);
  70. size++;
  71. }
  72. return size;
  73. }