JsonParser.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright Benoit Blanchon 2014-2016
  2. // MIT License
  3. //
  4. // Arduino JSON library
  5. // https://github.com/bblanchon/ArduinoJson
  6. // If you like this project, please add a star!
  7. #pragma once
  8. #include "../JsonBuffer.hpp"
  9. #include "../JsonVariant.hpp"
  10. #include "StringReader.hpp"
  11. #include "StringWriter.hpp"
  12. namespace ArduinoJson {
  13. namespace Internals {
  14. // Parse JSON string to create JsonArrays and JsonObjects
  15. // This internal class is not indended to be used directly.
  16. // Instead, use JsonBuffer.parseArray() or .parseObject()
  17. template <typename TReader, typename TWriter>
  18. class JsonParser {
  19. public:
  20. JsonParser(JsonBuffer *buffer, TReader reader, TWriter writer,
  21. uint8_t nestingLimit)
  22. : _buffer(buffer),
  23. _reader(reader),
  24. _writer(writer),
  25. _nestingLimit(nestingLimit) {}
  26. JsonArray &parseArray();
  27. JsonObject &parseObject();
  28. JsonVariant parseVariant() {
  29. JsonVariant result;
  30. parseAnythingTo(&result);
  31. return result;
  32. }
  33. private:
  34. JsonParser &operator=(const JsonParser &); // non-copiable
  35. static bool eat(TReader &, char charToSkip);
  36. FORCE_INLINE bool eat(char charToSkip) {
  37. return eat(_reader, charToSkip);
  38. }
  39. const char *parseString();
  40. bool parseAnythingTo(JsonVariant *destination);
  41. FORCE_INLINE bool parseAnythingToUnsafe(JsonVariant *destination);
  42. inline bool parseArrayTo(JsonVariant *destination);
  43. inline bool parseObjectTo(JsonVariant *destination);
  44. inline bool parseStringTo(JsonVariant *destination);
  45. static inline bool isInRange(char c, char min, char max) {
  46. return min <= c && c <= max;
  47. }
  48. static inline bool isLetterOrNumber(char c) {
  49. return isInRange(c, '0', '9') || isInRange(c, 'a', 'z') ||
  50. isInRange(c, 'A', 'Z') || c == '+' || c == '-' || c == '.';
  51. }
  52. static inline bool isQuote(char c) {
  53. return c == '\'' || c == '\"';
  54. }
  55. JsonBuffer *_buffer;
  56. TReader _reader;
  57. TWriter _writer;
  58. uint8_t _nestingLimit;
  59. };
  60. template <typename TJsonBuffer, typename TString>
  61. struct JsonParserBuilder {
  62. typedef typename Internals::StringFuncs<TString>::Iterator InputIterator;
  63. typedef JsonParser<StringReader<InputIterator>, TJsonBuffer &> TParser;
  64. static TParser makeParser(TJsonBuffer *buffer, TString &json,
  65. uint8_t nestingLimit) {
  66. return TParser(buffer, InputIterator(json), *buffer, nestingLimit);
  67. }
  68. };
  69. template <typename TJsonBuffer>
  70. struct JsonParserBuilder<TJsonBuffer, char *> {
  71. typedef typename Internals::StringFuncs<char *>::Iterator InputIterator;
  72. typedef JsonParser<StringReader<InputIterator>, StringWriter> TParser;
  73. static TParser makeParser(TJsonBuffer *buffer, char *json,
  74. uint8_t nestingLimit) {
  75. return TParser(buffer, InputIterator(json), json, nestingLimit);
  76. }
  77. };
  78. template <typename TJsonBuffer, size_t N>
  79. struct JsonParserBuilder<TJsonBuffer, char[N]>
  80. : JsonParserBuilder<TJsonBuffer, char *> {};
  81. template <typename TJsonBuffer, typename TString>
  82. inline typename JsonParserBuilder<TJsonBuffer, TString>::TParser makeParser(
  83. TJsonBuffer *buffer, TString &json, uint8_t nestingLimit) {
  84. return JsonParserBuilder<TJsonBuffer, TString>::makeParser(buffer, json,
  85. nestingLimit);
  86. }
  87. }
  88. }