c++jsonboost

Is it possible to emplace a key, value pair into a boost::json::value?


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?


Solution

  • 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}