json.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. //
  2. // json.cpp
  3. // json
  4. //
  5. // Created by Sam Jaffe on 1/30/16.
  6. // Copyright © 2016 Sam Jaffe. All rights reserved.
  7. //
  8. #include "json.hpp"
  9. const json::value json::value::null_value{};
  10. template <>
  11. void json::helper::parse_numeric(json::value & json, char const * & data) {
  12. numeric_token_info info = data;
  13. if ( info.is_double || info.parse_numeric() == DOUBLE ) {
  14. helper::parse_double(json, data);
  15. } else {
  16. uint_jt const val = info.val;
  17. if (info.is_negative) {
  18. if (val == INT_JT_OVER) {
  19. json = INT_JT_MIN;
  20. } else {
  21. json = -int_jt(val);
  22. }
  23. } else if (val <= uint_jt(INT_JT_MAX)) {
  24. json = int_jt(val);
  25. } else {
  26. json = val;
  27. }
  28. data = info.it;
  29. }
  30. }
  31. json::value& json::value::operator[](const size_t idx) {
  32. if (!is_array()) {
  33. data.set<array_jt>();
  34. }
  35. array_jt & val = data.get<array_jt>();
  36. if (val.size() <= idx) val.resize(idx+1);
  37. return val[idx];
  38. }
  39. json::value const& json::value::operator[](const size_t idx) const {
  40. if (!is_array()) return null_value;
  41. array_jt const& val = data.get<array_jt>();
  42. if (val.size() <= idx) return null_value;
  43. else return val[idx];
  44. }
  45. json::value& json::value::operator[](std::string const& key) {
  46. if (!is_object()) {
  47. data.set<object_jt>();
  48. }
  49. return data.get<object_jt>()[key];
  50. }
  51. json::value const& json::value::operator[](std::string const& key) const {
  52. if (!is_object()) return null_value;
  53. object_jt const& val = data.get<object_jt>();
  54. auto it = val.find(key);
  55. if (it != val.end()) {
  56. return it->second;
  57. } else {
  58. return null_value;
  59. }
  60. }
  61. json::value::string_jt const& json::value::as_string() const {
  62. return data.get<string_jt>();
  63. }
  64. json::value::double_jt json::value::as_double() const {
  65. if (data.is<double_jt>()) {
  66. return data.get<double_jt>();
  67. } else if (data.is<int_jt>()) {
  68. return static_cast<double_jt>(data.get<int_jt>());
  69. } else if (data.is<bool_jt>()) {
  70. return data.get<bool_jt>() ? 1.0 : 0.0;
  71. } else {
  72. return 0.0;
  73. }
  74. }
  75. json::value::int_jt json::value::as_int() const {
  76. if (data.is<double_jt>()) {
  77. return static_cast<int_jt>(data.get<double_jt>());
  78. } else if (data.is<int_jt>()) {
  79. return data.get<int_jt>();
  80. } else if (data.is<uint_jt>() && data.get<uint_jt>() <= uint_jt(INT_JT_MAX)) {
  81. return static_cast<int_jt>(data.get<uint_jt>());
  82. } else if (data.is<bool_jt>()) {
  83. return data.get<bool_jt>() ? 1 : 0;
  84. } else {
  85. return 0;
  86. }
  87. }
  88. json::value::uint_jt json::value::as_uint() const {
  89. if (data.is<double_jt>()) {
  90. return static_cast<uint_jt>(data.get<double_jt>());
  91. } else if (data.is<int_jt>() && data.get<int_jt>() >= 0) {
  92. return static_cast<uint_jt>(data.get<int_jt>());
  93. } else if (data.is<uint_jt>()) {
  94. return data.get<uint_jt>();
  95. } else if (data.is<bool_jt>()) {
  96. return data.get<bool_jt>() ? 1 : 0;
  97. } else {
  98. return 0;
  99. }
  100. }
  101. json::value::bool_jt json::value::as_bool() const {
  102. if (data.is<double_jt>()) {
  103. return data.get<double_jt>() != 0;
  104. } else if (data.is<uint_jt>()) {
  105. return data.get<uint_jt>() != 0;
  106. } else if (data.is<int_jt>()) {
  107. return data.get<int_jt>() != 0;
  108. } else if (data.is<bool_jt>()) {
  109. return data.get<bool_jt>();
  110. } else {
  111. return false;
  112. }
  113. }