msgpack.md

August 22, 2025 ยท View on GitHub

msgpack extension

The msgpack extension implements encode to and decode from the MessagePack data format. You can either parse into or serialize from a variant-like data structure, basic_json, or your own data structures, using json_type_traits.

decode_msgpack, try_decode_msgpack

basic_msgpack_cursor

encode_msgpack

basic_msgpack_encoder

msgpack_options

Mappings between MessagePack and jsoncons data items

MessagePack data itemext typejsoncons data itemjsoncons tag
nilnull
true, falsebool
negative fixnum, int 8, int 16, int 32, int 64int64
positive fixnum, uint 8, uint 16, uint 32, uint 64uint64
float32, float64double
fixstr, str 8, str 16, str 32string
bin 8, bin 16, bin 32byte_string
fixext1, fixext2, fixext4, fixext8, fixext16, ext8, ext16, ext320-127byte_string
4 byte length-1 (timestamp 32)uint64seconds
8 byte length-1 (timestamp 64)stringepoch_nanosecond
12 byte length-1 (timestamp 96)stringepoch_nanosecond
arrayarray
mapobject

Examples

ext format code example

#include <jsoncons/json.hpp>
#include <jsoncons_ext/msgpack/msgpack.hpp>
#include <cassert>

using namespace jsoncons;

int main()
{
    std::vector<uint8_t> input = {

        0x82, // map, length 2
          0xa5, // string, length 5
            'H','e','l','l','o',
          0xa5, // string, length 5
            'W','o','r','l','d',
          0xa4, // string, length 4
             'D','a','t','a',
          0xc7, // ext8 format code
            0x06, // length 6
            0x07, // type
              'f','o','o','b','a','r'
    };

    ojson j = msgpack::decode_msgpack<ojson>(input);

    std::cout << "(1)\n" << pretty_print(j) << "\n\n";
    std::cout << "(2) " << j["Data"].tag() << "("  << j["Data"].ext_tag() << ")\n\n";
    
    // Get ext value as a std::vector<uint8_t>
    auto v = j["Data"].as<std::vector<uint8_t>>(); 

    std::cout << "(3)\n";
    std::cout << byte_string_view(v) << "\n\n";

    std::vector<uint8_t> output;
    msgpack::encode_msgpack(j,output);
    assert(output == input);
}

Output:

(1)
{
    "Hello": "World",
    "Data": "Zm9vYmFy"
}

(2) ext(7)

(3)
66,6f,6f,62,61,72

JSON to message pack

Input JSON file book.json

[
    {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
    },
    {
        "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
    }
]
#include <jsoncons/json.hpp>
#include <jsoncons_ext/msgpack/msgpack.hpp>

using namespace jsoncons;

int main()
{
    std::ifstream is("input/book.json");
    ojson j1;
    is >> j1;

    // Encode ojson to MessagePack
    std::vector<uint8_t> v;
    msgpack::encode_msgpack(j1, v);

    // Decode MessagePack to ojson 
    ojson j2 = msgpack::decode_msgpack<ojson>(v);

    std::cout << pretty_print(j2) << '\n';

    // or to json (now alphabetically sorted)
    json j3 = msgpack::decode_msgpack<json>(v);

    // or to wjson (converts from utf8 to wide characters)
    wjson j4 = msgpack::decode_msgpack<wjson>(v);
}

Output:

[
    {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
    },
    {
        "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
    }
]