JsonNode.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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(const char * data, size_t datasize);
  38. //Create tree from JSON file
  39. explicit JsonNode(std::string 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. float & Float();
  52. std::string & String();
  53. JsonVector & Vector();
  54. JsonMap & Struct();
  55. //const accessors, will cause assertion failure on type mismatch
  56. const bool & Bool() const;
  57. const float & Float() const;
  58. const std::string & String() const;
  59. const JsonVector & Vector() const;
  60. const JsonMap & Struct() const;
  61. //formatted output of this node in JSON format
  62. void write(std::ostream &out, std::string prefix="") const;
  63. //operator [], for structs only - get child node by name
  64. JsonNode & operator[](std::string child);
  65. const JsonNode & operator[](std::string child) const;
  66. //error value for const operator[]
  67. static const JsonNode nullNode;
  68. };
  69. std::ostream & operator<<(std::ostream &out, const JsonNode &node);
  70. //Tiny string class that use const char* as data for speed, members are private for ease of debugging
  71. class constString
  72. {
  73. const char *data;
  74. const size_t datasize;
  75. public:
  76. constString(const char * inputString, size_t stringSize):
  77. data(inputString),
  78. datasize(stringSize)
  79. {
  80. }
  81. inline size_t size() const
  82. {
  83. return datasize;
  84. };
  85. inline const char& operator[] (size_t position)
  86. {
  87. assert (position < datasize);
  88. return data[position];
  89. }
  90. };
  91. //Internal class for std::string -> JsonNode conversion
  92. class JsonParser
  93. {
  94. std::string errors; // Contains description of all encountered errors
  95. constString input; // Input data
  96. unsigned int lineCount; // Currently parsed line, starting from 1
  97. size_t lineStart; // Position of current line start
  98. size_t pos; // Current position of parser
  99. //Helpers
  100. bool extractEscaping(std::string &str);
  101. bool extractLiteral(const std::string &literal);
  102. bool extractString(std::string &string);
  103. bool extractWhitespace(bool verbose = true);
  104. bool extractSeparator();
  105. //Methods for extracting JSON data
  106. bool extractArray(JsonNode &node);
  107. bool extractFalse(JsonNode &node);
  108. bool extractFloat(JsonNode &node);
  109. bool extractNull(JsonNode &node);
  110. bool extractString(JsonNode &node);
  111. bool extractStruct(JsonNode &node);
  112. bool extractTrue(JsonNode &node);
  113. bool extractValue(JsonNode &node);
  114. //Add error\warning message to list
  115. bool error(const std::string &message, bool warning=false);
  116. public:
  117. JsonParser(const char * inputString, size_t stringSize, JsonNode &root);
  118. };