17 #ifndef GRPC_SUPPORT_JSON_H
18 #define GRPC_SUPPORT_JSON_H
25 #include <type_traits>
30 #include "absl/strings/str_cat.h"
33 namespace experimental {
50 template <
typename Sink>
57 sink.Append(
"boolean");
60 sink.Append(
"number");
63 sink.Append(
"string");
66 sink.Append(
"object");
74 using Object = std::map<std::string, Json>;
75 using Array = std::vector<Json>;
87 json.value_ = NumberValue{str};
92 json.value_ = NumberValue{std::string(str)};
97 json.value_ = NumberValue{std::move(str)};
100 template <
typename T>
103 json.value_ = NumberValue{absl::StrCat(value)};
115 json.value_ = std::string(str);
120 json.value_ = std::move(str);
132 json.value_ = std::move(
object);
144 json.value_ = std::move(
array);
155 Json(
Json&& other) noexcept : value_(std::move(other.value_)) {
156 other.value_ = std::monostate();
159 value_ = std::move(other.value_);
160 other.value_ = std::monostate();
166 struct ValueFunctor {
174 return std::visit(ValueFunctor(), value_);
179 bool boolean()
const {
return std::get<bool>(value_); }
184 const NumberValue* num = std::get_if<NumberValue>(&value_);
185 if (num !=
nullptr)
return num->value;
186 return std::get<std::string>(value_);
195 const Array&
array()
const {
return std::get<Array>(value_); }
204 bool operator==(
const NumberValue& other)
const {
205 return value == other.value;
208 using Value = std::variant<std::monostate,
215 explicit Json(Value value) : value_(
std::move(value)) {}
223 #endif // GRPC_SUPPORT_JSON_H