json.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. json::value& json::value::operator[](const size_t idx) {
  11. if (!is_array()) {
  12. data.set<array_jt>();
  13. }
  14. array_jt & val = data.get<array_jt>();
  15. if (val.size() <= idx) val.resize(idx+1);
  16. return val[idx];
  17. }
  18. json::value const& json::value::operator[](const size_t idx) const {
  19. if (!is_array()) return null_value;
  20. array_jt const& val = data.get<array_jt>();
  21. if (val.size() <= idx) return null_value;
  22. else return val[idx];
  23. }
  24. json::value& json::value::operator[](std::string const& key) {
  25. if (!is_object()) {
  26. data.set<object_jt>();
  27. }
  28. return data.get<object_jt>()[key];
  29. }
  30. json::value const& json::value::operator[](std::string const& key) const {
  31. if (!is_object()) return null_value;
  32. object_jt const& val = data.get<object_jt>();
  33. auto it = val.find(key);
  34. if (it != val.end()) {
  35. return it->second;
  36. } else {
  37. return null_value;
  38. }
  39. }
  40. json::value::string_jt const& json::value::as_string() const {
  41. return data.get<string_jt>();
  42. }
  43. json::value::double_jt json::value::as_double() const {
  44. if (data.is<double_jt>()) {
  45. return data.get<double_jt>();
  46. } else if (data.is<int_jt>()) {
  47. return static_cast<double_jt>(data.get<int_jt>());
  48. } else if (data.is<bool_jt>()) {
  49. return data.get<bool_jt>() ? 1.0 : 0.0;
  50. } else {
  51. return 0.0;
  52. }
  53. }
  54. json::value::int_jt json::value::as_int() const {
  55. if (data.is<double_jt>()) {
  56. return static_cast<int_jt>(data.get<double_jt>());
  57. } else if (data.is<int_jt>()) {
  58. return data.get<int_jt>();
  59. } else if (data.is<uint_jt>() && data.get<uint_jt>() <= uint_jt(INT_JT_MAX)) {
  60. return static_cast<int_jt>(data.get<uint_jt>());
  61. } else if (data.is<bool_jt>()) {
  62. return data.get<bool_jt>() ? 1 : 0;
  63. } else {
  64. return 0;
  65. }
  66. }
  67. json::value::uint_jt json::value::as_uint() const {
  68. if (data.is<double_jt>()) {
  69. return static_cast<int_jt>(data.get<double_jt>());
  70. } else if (data.is<int_jt>() && data.get<int_jt>() >= 0) {
  71. return data.get<int_jt>();
  72. } else if (data.is<uint_jt>()) {
  73. return data.get<uint_jt>();
  74. } else if (data.is<bool_jt>()) {
  75. return data.get<bool_jt>() ? 1 : 0;
  76. } else {
  77. return 0;
  78. }
  79. }
  80. json::value::bool_jt json::value::as_bool() const {
  81. if (data.is<double_jt>()) {
  82. return data.get<double_jt>() != 0;
  83. } else if (data.is<uint_jt>()) {
  84. return data.get<uint_jt>() != 0;
  85. } else if (data.is<int_jt>()) {
  86. return data.get<int_jt>() != 0;
  87. } else if (data.is<bool_jt>()) {
  88. return data.get<bool_jt>();
  89. } else {
  90. return false;
  91. }
  92. }