json_common.hpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //
  2. // json_common.h
  3. // json
  4. //
  5. // Created by Sam Jaffe on 4/22/16.
  6. //
  7. #pragma once
  8. #include "../variant/variant.hpp"
  9. #include <cstdlib>
  10. #include <iostream>
  11. #include <map>
  12. #include <stdexcept>
  13. #include <string>
  14. #include <vector>
  15. namespace json {
  16. using string_jt = std::string;
  17. using double_jt = double;
  18. using int_jt = int32_t;
  19. using uint_jt = uint32_t;
  20. using bool_jt = bool;
  21. using numeric_jt = variant<int_jt, uint_jt, double_jt>;
  22. class value;
  23. class malformed_json_exception :
  24. public std::domain_error {
  25. using std::domain_error::domain_error;
  26. };
  27. }
  28. namespace json {
  29. namespace helper {
  30. const char get_next_element(char const*& data);
  31. /**
  32. * @throws json::malformed_json_exception
  33. */
  34. void advance_to_boundary(char const endtok, char const *& data);
  35. /**
  36. * @throws json::malformed_json_exception
  37. */
  38. std::string parse_string(char const * & data);
  39. template <typename T>
  40. void parse_string(T& json, char const * & data) {
  41. json = parse_string(data);
  42. }
  43. template <typename T>
  44. void parse_double(T& json, char const * & data) {
  45. json = atof(data);
  46. }
  47. template <typename T>
  48. void parse_integer(T& json, char const * & data) {
  49. json = atoi(data);
  50. }
  51. }
  52. namespace parser {
  53. template <typename T>
  54. void parse(T& json, std::string const& str) {
  55. parse(json, str.c_str());
  56. }
  57. template <typename T>
  58. void parse(T& json, std::istream & in) {
  59. in.seekg(0, std::ios_base::end);
  60. size_t end = in.tellg();
  61. char data[end];
  62. in.seekg(0);
  63. in.read(data, end);
  64. parse(json, data);
  65. }
  66. }
  67. }