Is it possible to emplace or otherwise add a key/value pair into a boost::json::value, like you can into a boost::json::object?
boost::json::object obj;
obj.emplace("timestamp", "2023-01-01T00:00:00");
Does there exist some sort of short notation, something like this?
boost::json::value val;
val["key"] = "value";
Or do you need to explicitly create a boost::json::object for such use?
As I understand it, the boost::json::value is a kind of a wrapper for various types of json data, does it work similarly to std::variant?
As I understand it, the boost::json::value is a kind of a wrapper for various types of json data, does it work similarly to std::variant?
Yes. See the interface here: https://www.boost.org/doc/libs/1_86_0/libs/json/doc/html/json/dom/value.html
The direct assignment could be:
val = {"key", "value"}; // ["key":"value"]
val = { {"key", "value"} }; // {"key":"value"}
val = {
{"key", "value"},
{"key2", 42},
{"key3", true},
}; // {"key":"value","key2":42,"key3":true}
To manipulate an existing object: as_object()
, e.g.
val.as_object().emplace("more", val);
Demo program: Live On Coliru
#include <boost/json.hpp>
#include <iostream>
namespace json = boost::json;
int main()
{
json::value val;
val = {"key", "value"}; std::cout << val << std::endl;
val = {{"key", "value"}}; std::cout << val << std::endl;
val = {
{"key", "value"},
{"key2", 42},
{"key3", true},
};
std::cout << val << std::endl;
val.as_object().emplace("more", val);
std::cout << val << std::endl;
val.at("more").as_object().emplace("more", val);
std::cout << val << std::endl;
val.at("more").emplace_null();
std::cout << val << std::endl;
}
Printing
["key","value"]
{"key":"value"}
{"key":"value","key2":42,"key3":true}
{"key":"value","key2":42,"key3":true,"more":{"key":"value","key2":42,"key3":true}}
{"key":"value","key2":42,"key3":true,"more":{"key":"value","key2":42,"key3":true,"more":{"key":"value","key2":42,"ke
y3":true,"more":{"key":"value","key2":42,"key3":true}}}}
{"key":"value","key2":42,"key3":true,"more":null}