17 #ifndef GRPC_SUPPORT_JSON_H
18 #define GRPC_SUPPORT_JSON_H
28 #include "absl/strings/str_cat.h"
29 #include "absl/types/variant.h"
32 namespace experimental {
49 using Object = std::map<std::string, Json>;
50 using Array = std::vector<Json>;
62 json.value_ = NumberValue{str};
67 json.value_ = NumberValue{std::string(str)};
72 json.value_ = NumberValue{std::move(str)};
77 json.value_ = NumberValue{absl::StrCat(value)};
82 json.value_ = NumberValue{absl::StrCat(value)};
87 json.value_ = NumberValue{absl::StrCat(value)};
92 json.value_ = NumberValue{absl::StrCat(value)};
97 json.value_ = NumberValue{absl::StrCat(value)};
109 json.value_ = std::string(str);
114 json.value_ = std::move(str);
126 json.value_ = std::move(
object);
138 json.value_ = std::move(
array);
149 Json(
Json&& other) noexcept : value_(std::move(other.value_)) {
150 other.value_ = absl::monostate();
153 value_ = std::move(other.value_);
154 other.value_ = absl::monostate();
160 struct ValueFunctor {
168 return absl::visit(ValueFunctor(), value_);
173 bool boolean()
const {
return absl::get<bool>(value_); }
178 const NumberValue* num = absl::get_if<NumberValue>(&value_);
179 if (num !=
nullptr)
return num->value;
180 return absl::get<std::string>(value_);
189 const Array&
array()
const {
return absl::get<Array>(value_); }
198 bool operator==(
const NumberValue& other)
const {
199 return value == other.value;
202 using Value = absl::variant<absl::monostate,
209 explicit Json(Value value) : value_(
std::move(value)) {}
217 #endif // GRPC_SUPPORT_JSON_H