JsonNode.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #pragma once
  2. #include "../global.h"
  3. #include <iostream>
  4. #include <map>
  5. #include <string>
  6. #include <vector>
  7. class JsonNode;
  8. typedef std::map <std::string, JsonNode> JsonMap;
  9. typedef std::vector <JsonNode> JsonVector;
  10. class DLL_EXPORT JsonNode
  11. {
  12. public:
  13. enum JsonType
  14. {
  15. DATA_NULL,
  16. DATA_BOOL,
  17. DATA_FLOAT,
  18. DATA_STRING,
  19. DATA_VECTOR,
  20. DATA_STRUCT
  21. };
  22. private:
  23. union JsonData
  24. {
  25. bool Bool;
  26. float Float;
  27. std::string* String;
  28. JsonVector* Vector;
  29. JsonMap* Struct;
  30. };
  31. JsonType type;
  32. JsonData data;
  33. public:
  34. //Create empty node
  35. JsonNode(JsonType Type = DATA_NULL);
  36. //Create tree from Json-formatted input
  37. explicit JsonNode(std::string input);
  38. //Create tree from JSON file
  39. explicit JsonNode(const char *filename);
  40. //Copy c-tor
  41. JsonNode(const JsonNode &copy);
  42. ~JsonNode();
  43. // Deep copy of this node
  44. JsonNode& operator =(const JsonNode &node);
  45. //Convert node to another type. Converting to NULL will clear all data
  46. void setType(JsonType Type);
  47. JsonType getType() const;
  48. bool isNull() const;
  49. //non-const accessors, node will change type on type mismatch
  50. bool & Bool();
  51. int & Int();
  52. float & Float();
  53. std::string & String();
  54. JsonVector & Vector();
  55. JsonMap & Struct();
  56. //const accessors, will cause assertion failure on type mismatch
  57. const bool & Bool() const;
  58. const int & Int() const;
  59. const float & Float() const;
  60. const std::string & String() const;
  61. const JsonVector & Vector() const;
  62. const JsonMap & Struct() const;
  63. //formatted output of this node in JSON format
  64. void write(std::ostream &out, std::string prefix="") const;
  65. //operator [], for structs only - get child node by name
  66. JsonNode & operator[](std::string child);
  67. const JsonNode & operator[](std::string child) const;
  68. //error value for const operator[]
  69. static const JsonNode nullNode;
  70. };
  71. std::ostream & operator<<(std::ostream &out, const JsonNode &node);
  72. //Internal class for std::string -> JsonNode conversion
  73. class JsonParser
  74. {
  75. std::string errors; // Contains description of all encountered errors
  76. const std::string input;// Input data
  77. unsigned int lineCount; // Currently parsed line, starting from 1
  78. size_t lineStart; // Position of current line start
  79. size_t pos; // Current position of parser
  80. //Helpers
  81. bool extractEscaping(std::string &str);
  82. bool extractLiteral(const std::string &literal);
  83. bool extractString(std::string &string);
  84. bool extractWhitespace(bool verbose = true);
  85. bool extractSeparator();
  86. //Methods for extracting JSON data
  87. bool extractArray(JsonNode &node);
  88. bool extractFalse(JsonNode &node);
  89. bool extractFloat(JsonNode &node);
  90. bool extractNull(JsonNode &node);
  91. bool extractString(JsonNode &node);
  92. bool extractStruct(JsonNode &node);
  93. bool extractTrue(JsonNode &node);
  94. bool extractValue(JsonNode &node);
  95. //Add error\warning message to list
  96. bool error(const std::string &message, bool warning=false);
  97. public:
  98. JsonParser(const std::string inputString, JsonNode &root);
  99. };