This commit is contained in:
nlohmann committed 2026-08-19 18:20:55 +00:00
1 parent b4e4dbe346
commit e5ef5a4cd3
261 files changed
+4526 -4483

No files matched your search

+49 -49
View File
@@ -36,122 +36,122 @@ vector &lt;|-- binary_t</code></pre> <p>By default, binary values are stored as
<span class=n>j3</span><span class=p>.</span><span class=n>get_binary</span><span class=p>().</span><span class=n>subtype</span><span class=p>();</span><span class=w> </span><span class=c1>// returns std::uint64_t(-1) as j3 has no subtype</span>
</code></pre></div> <h2 id=serialization>Serialization<a class=headerlink href=#serialization title="Permanent link">&para;</a></h2> <p>Binary values are serialized differently according to the formats.</p> <h3 id=json><abbr title="JavaScript Object Notation">JSON</abbr><a class=headerlink href=#json title="Permanent link">&para;</a></h3> <p><abbr title="JavaScript Object Notation">JSON</abbr> does not have a binary type, and this library does not introduce a new type as this would break conformance. Instead, binary values are serialized as an object with two keys: <code>bytes</code> holds an array of integers, and <code>subtype</code> is an integer or <code>null</code>.</p> <details class=example> <summary>Example</summary> <p>Code:</p> <div class=highlight><pre><span></span><code><span class=c1>// create a binary value of subtype 42</span>
<span class=n>json</span><span class=w> </span><span class=n>j</span><span class=p>;</span>
<span class=n>j</span><span class=p>[</span><span class=s>&quot;binary&quot;</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=n>j</span><span class=p>[</span><span class=s>"binary"</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=c1>// serialize to standard output</span>
<span class=n>std</span><span class=o>::</span><span class=n>cout</span><span class=w> </span><span class=o>&lt;&lt;</span><span class=w> </span><span class=n>j</span><span class=p>.</span><span class=n>dump</span><span class=p>(</span><span class=mi>2</span><span class=p>)</span><span class=w> </span><span class=o>&lt;&lt;</span><span class=w> </span><span class=n>std</span><span class=o>::</span><span class=n>endl</span><span class=p>;</span>
</code></pre></div> <p>Output:</p> <div class=highlight><pre><span></span><code><span class=p>{</span>
<span class=w> </span><span class=nt>&quot;binary&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
<span class=w> </span><span class=nt>&quot;bytes&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>],</span>
<span class=w> </span><span class=nt>&quot;subtype&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>42</span>
<span class=w> </span><span class=nt>"binary"</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
<span class=w> </span><span class=nt>"bytes"</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>],</span>
<span class=w> </span><span class=nt>"subtype"</span><span class=p>:</span><span class=w> </span><span class=mi>42</span>
<span class=w> </span><span class=p>}</span>
<span class=p>}</span>
</code></pre></div> </details> <div class="admonition warning"> <p class=admonition-title>No roundtrip for binary values</p> <p>The <abbr title="JavaScript Object Notation">JSON</abbr> parser will not parse the objects generated by binary values back to binary values. This is by design to remain standards compliant. Serializing binary values to <abbr title="JavaScript Object Notation">JSON</abbr> is only implemented for debugging purposes.</p> </div> <h3 id=bjdata><abbr title="Binary JData">BJData</abbr><a class=headerlink href=#bjdata title="Permanent link">&para;</a></h3> <p><a href=../binary_formats/bjdata/ ><abbr title="Binary JData">BJData</abbr></a> neither supports binary values nor subtypes and proposes to serialize binary values as an array of uint8 values. The library implements this translation.</p> <details class=example> <summary>Example</summary> <p>Code:</p> <div class=highlight><pre><span></span><code><span class=c1>// create a binary value of subtype 42 (will be ignored in BJData)</span>
<span class=n>json</span><span class=w> </span><span class=n>j</span><span class=p>;</span>
<span class=n>j</span><span class=p>[</span><span class=s>&quot;binary&quot;</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=n>j</span><span class=p>[</span><span class=s>"binary"</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=c1>// convert to BJData</span>
<span class=k>auto</span><span class=w> </span><span class=n>v</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>to_bjdata</span><span class=p>(</span><span class=n>j</span><span class=p>);</span><span class=w> </span>
</code></pre></div> <p><code>v</code> is a <code>std::vector&lt;std::uint8_t&gt;</code> with the following 20 elements:</p> <div class=highlight><pre><span></span><code><span class=mh>0x7B</span><span class=w> </span><span class=c1>// &#39;{&#39;</span>
</code></pre></div> <p><code>v</code> is a <code>std::vector&lt;std::uint8_t&gt;</code> with the following 20 elements:</p> <div class=highlight><pre><span></span><code><span class=mh>0x7B</span><span class=w> </span><span class=c1>// '{'</span>
<span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x06</span><span class=w> </span><span class=c1>// i 6 (length of the key)</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// &quot;binary&quot;</span>
<span class=w> </span><span class=mh>0x5B</span><span class=w> </span><span class=c1>// &#39;[&#39;</span>
<span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xCA</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xFE</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xBA</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xBE</span><span class=w> </span><span class=c1>// content (each byte prefixed with &#39;U&#39;)</span>
<span class=w> </span><span class=mh>0x5D</span><span class=w> </span><span class=c1>// &#39;]&#39;</span>
<span class=mh>0x7D</span><span class=w> </span><span class=c1>// &#39;}&#39;</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// "binary"</span>
<span class=w> </span><span class=mh>0x5B</span><span class=w> </span><span class=c1>// '['</span>
<span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xCA</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xFE</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xBA</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xBE</span><span class=w> </span><span class=c1>// content (each byte prefixed with 'U')</span>
<span class=w> </span><span class=mh>0x5D</span><span class=w> </span><span class=c1>// ']'</span>
<span class=mh>0x7D</span><span class=w> </span><span class=c1>// '}'</span>
</code></pre></div> <p>The following code uses the type and size optimization for <abbr title="Binary JData">BJData</abbr>:</p> <div class=highlight><pre><span></span><code><span class=c1>// convert to BJData using the size and type optimization</span>
<span class=k>auto</span><span class=w> </span><span class=n>v</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>to_bjdata</span><span class=p>(</span><span class=n>j</span><span class=p>,</span><span class=w> </span><span class=nb>true</span><span class=p>,</span><span class=w> </span><span class=nb>true</span><span class=p>);</span>
</code></pre></div> <p>The resulting vector has 22 elements; the optimization is not effective for examples with few values:</p> <div class=highlight><pre><span></span><code><span class=mh>0x7B</span><span class=w> </span><span class=c1>// &#39;{&#39;</span>
<span class=w> </span><span class=mh>0x23</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x01</span><span class=w> </span><span class=c1>// &#39;#&#39; &#39;i&#39; type of the array elements: unsigned integers</span>
</code></pre></div> <p>The resulting vector has 22 elements; the optimization is not effective for examples with few values:</p> <div class=highlight><pre><span></span><code><span class=mh>0x7B</span><span class=w> </span><span class=c1>// '{'</span>
<span class=w> </span><span class=mh>0x23</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x01</span><span class=w> </span><span class=c1>// '#' 'i' type of the array elements: unsigned integers</span>
<span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x06</span><span class=w> </span><span class=c1>// i 6 (length of the key)</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// &quot;binary&quot;</span>
<span class=w> </span><span class=mh>0x5B</span><span class=w> </span><span class=c1>// &#39;[&#39; array</span>
<span class=w> </span><span class=mh>0x24</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=c1>// &#39;$&#39; &#39;U&#39; type of the array elements: unsigned integers</span>
<span class=w> </span><span class=mh>0x23</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x04</span><span class=w> </span><span class=c1>// &#39;#&#39; i 4 number of array elements</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// "binary"</span>
<span class=w> </span><span class=mh>0x5B</span><span class=w> </span><span class=c1>// '[' array</span>
<span class=w> </span><span class=mh>0x24</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=c1>// '$' 'U' type of the array elements: unsigned integers</span>
<span class=w> </span><span class=mh>0x23</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x04</span><span class=w> </span><span class=c1>// '#' i 4 number of array elements</span>
<span class=w> </span><span class=mh>0xCA</span><span class=w> </span><span class=mh>0xFE</span><span class=w> </span><span class=mh>0xBA</span><span class=w> </span><span class=mh>0xBE</span><span class=w> </span><span class=c1>// content</span>
</code></pre></div> <p>Note that subtype (42) is <strong>not</strong> serialized and that <abbr title="Binary JData">BJData</abbr> has <strong>no binary type</strong>, and deserializing <code>v</code> would yield the following value:</p> <div class=highlight><pre><span></span><code><span class=p>{</span>
<span class=w> </span><span class=nt>&quot;binary&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>]</span>
<span class=w> </span><span class=nt>"binary"</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>]</span>
<span class=p>}</span>
</code></pre></div> </details> <h3 id=bson><abbr title="Binary JSON">BSON</abbr><a class=headerlink href=#bson title="Permanent link">&para;</a></h3> <p><a href=../binary_formats/bson/ ><abbr title="Binary JSON">BSON</abbr></a> supports binary values and subtypes. If a subtype is given, it is used and added as an unsigned 8-bit integer. If no subtype is given, the generic binary subtype 0x00 is used.</p> <details class=example> <summary>Example</summary> <p>Code:</p> <div class=highlight><pre><span></span><code><span class=c1>// create a binary value of subtype 42</span>
<span class=n>json</span><span class=w> </span><span class=n>j</span><span class=p>;</span>
<span class=n>j</span><span class=p>[</span><span class=s>&quot;binary&quot;</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=n>j</span><span class=p>[</span><span class=s>"binary"</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=c1>// convert to BSON</span>
<span class=k>auto</span><span class=w> </span><span class=n>v</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>to_bson</span><span class=p>(</span><span class=n>j</span><span class=p>);</span><span class=w> </span>
</code></pre></div> <p><code>v</code> is a <code>std::vector&lt;std::uint8_t&gt;</code> with the following 22 elements:</p> <div class=highlight><pre><span></span><code><span class=mh>0x16</span><span class=w> </span><span class=mh>0x00</span><span class=w> </span><span class=mh>0x00</span><span class=w> </span><span class=mh>0x00</span><span class=w> </span><span class=c1>// number of bytes in the document</span>
<span class=w> </span><span class=mh>0x05</span><span class=w> </span><span class=c1>// binary value</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=mh>0x00</span><span class=w> </span><span class=c1>// key &quot;binary&quot; + null byte</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=mh>0x00</span><span class=w> </span><span class=c1>// key "binary" + null byte</span>
<span class=w> </span><span class=mh>0x04</span><span class=w> </span><span class=mh>0x00</span><span class=w> </span><span class=mh>0x00</span><span class=w> </span><span class=mh>0x00</span><span class=w> </span><span class=c1>// number of bytes</span>
<span class=w> </span><span class=mh>0x2a</span><span class=w> </span><span class=c1>// subtype</span>
<span class=w> </span><span class=mh>0xCA</span><span class=w> </span><span class=mh>0xFE</span><span class=w> </span><span class=mh>0xBA</span><span class=w> </span><span class=mh>0xBE</span><span class=w> </span><span class=c1>// content</span>
<span class=mh>0x00</span><span class=w> </span><span class=c1>// end of the document</span>
</code></pre></div> <p>Note that the serialization preserves the subtype, and deserializing <code>v</code> would yield the following value:</p> <div class=highlight><pre><span></span><code><span class=p>{</span>
<span class=w> </span><span class=nt>&quot;binary&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
<span class=w> </span><span class=nt>&quot;bytes&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>],</span>
<span class=w> </span><span class=nt>&quot;subtype&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>42</span>
<span class=w> </span><span class=nt>"binary"</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
<span class=w> </span><span class=nt>"bytes"</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>],</span>
<span class=w> </span><span class=nt>"subtype"</span><span class=p>:</span><span class=w> </span><span class=mi>42</span>
<span class=w> </span><span class=p>}</span>
<span class=p>}</span>
</code></pre></div> </details> <h3 id=cbor><abbr title="Concise Binary Object Representation">CBOR</abbr><a class=headerlink href=#cbor title="Permanent link">&para;</a></h3> <p><a href=../binary_formats/cbor/ ><abbr title="Concise Binary Object Representation">CBOR</abbr></a> supports binary values, but no subtypes. Subtypes will be serialized as tags. Any binary value will be serialized as byte strings. The library will choose the smallest representation using the length of the byte array.</p> <details class=example> <summary>Example</summary> <p>Code:</p> <div class=highlight><pre><span></span><code><span class=c1>// create a binary value of subtype 42</span>
<span class=n>json</span><span class=w> </span><span class=n>j</span><span class=p>;</span>
<span class=n>j</span><span class=p>[</span><span class=s>&quot;binary&quot;</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=n>j</span><span class=p>[</span><span class=s>"binary"</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=c1>// convert to CBOR</span>
<span class=k>auto</span><span class=w> </span><span class=n>v</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>to_cbor</span><span class=p>(</span><span class=n>j</span><span class=p>);</span><span class=w> </span>
</code></pre></div> <p><code>v</code> is a <code>std::vector&lt;std::uint8_t&gt;</code> with the following 15 elements:</p> <div class=highlight><pre><span></span><code><span class=mh>0xA1</span><span class=w> </span><span class=c1>// map(1)</span>
<span class=w> </span><span class=mh>0x66</span><span class=w> </span><span class=c1>// text(6)</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// &quot;binary&quot;</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// "binary"</span>
<span class=w> </span><span class=mh>0xD8</span><span class=w> </span><span class=mh>0x2A</span><span class=w> </span><span class=c1>// tag(42)</span>
<span class=w> </span><span class=mh>0x44</span><span class=w> </span><span class=c1>// bytes(4)</span>
<span class=w> </span><span class=mh>0xCA</span><span class=w> </span><span class=mh>0xFE</span><span class=w> </span><span class=mh>0xBA</span><span class=w> </span><span class=mh>0xBE</span><span class=w> </span><span class=c1>// content</span>
</code></pre></div> <p>Note that the subtype is serialized as tag. However, parsing tagged values yield a parse error unless <code>json::cbor_tag_handler_t::ignore</code> or <code>json::cbor_tag_handler_t::store</code> is passed to <code>json::from_cbor</code>.</p> <div class=highlight><pre><span></span><code><span class=p>{</span>
<span class=w> </span><span class=nt>&quot;binary&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
<span class=w> </span><span class=nt>&quot;bytes&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>],</span>
<span class=w> </span><span class=nt>&quot;subtype&quot;</span><span class=p>:</span><span class=w> </span><span class=kc>null</span>
<span class=w> </span><span class=nt>"binary"</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
<span class=w> </span><span class=nt>"bytes"</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>],</span>
<span class=w> </span><span class=nt>"subtype"</span><span class=p>:</span><span class=w> </span><span class=kc>null</span>
<span class=w> </span><span class=p>}</span>
<span class=p>}</span>
</code></pre></div> </details> <h3 id=messagepack>MessagePack<a class=headerlink href=#messagepack title="Permanent link">&para;</a></h3> <p><a href=../binary_formats/messagepack/ >MessagePack</a> supports binary values and subtypes. If a subtype is given, the ext family is used. The library will choose the smallest representation among fixext1, fixext2, fixext4, fixext8, ext8, ext16, and ext32. The subtype is then added as a signed 8-bit integer.</p> <p>If no subtype is given, the bin family (bin8, bin16, bin32) is used.</p> <details class=example> <summary>Example</summary> <p>Code:</p> <div class=highlight><pre><span></span><code><span class=c1>// create a binary value of subtype 42</span>
<span class=n>json</span><span class=w> </span><span class=n>j</span><span class=p>;</span>
<span class=n>j</span><span class=p>[</span><span class=s>&quot;binary&quot;</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=n>j</span><span class=p>[</span><span class=s>"binary"</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=c1>// convert to MessagePack</span>
<span class=k>auto</span><span class=w> </span><span class=n>v</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>to_msgpack</span><span class=p>(</span><span class=n>j</span><span class=p>);</span><span class=w> </span>
</code></pre></div> <p><code>v</code> is a <code>std::vector&lt;std::uint8_t&gt;</code> with the following 14 elements:</p> <div class=highlight><pre><span></span><code><span class=mh>0x81</span><span class=w> </span><span class=c1>// fixmap1</span>
<span class=w> </span><span class=mh>0xA6</span><span class=w> </span><span class=c1>// fixstr6</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// &quot;binary&quot;</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// "binary"</span>
<span class=w> </span><span class=mh>0xD6</span><span class=w> </span><span class=c1>// fixext4</span>
<span class=w> </span><span class=mh>0x2A</span><span class=w> </span><span class=c1>// subtype</span>
<span class=w> </span><span class=mh>0xCA</span><span class=w> </span><span class=mh>0xFE</span><span class=w> </span><span class=mh>0xBA</span><span class=w> </span><span class=mh>0xBE</span><span class=w> </span><span class=c1>// content</span>
</code></pre></div> <p>Note that the serialization preserves the subtype, and deserializing <code>v</code> would yield the following value:</p> <div class=highlight><pre><span></span><code><span class=p>{</span>
<span class=w> </span><span class=nt>&quot;binary&quot;</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
<span class=w> </span><span class=nt>&quot;bytes&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>],</span>
<span class=w> </span><span class=nt>&quot;subtype&quot;</span><span class=p>:</span><span class=w> </span><span class=mi>42</span>
<span class=w> </span><span class=nt>"binary"</span><span class=p>:</span><span class=w> </span><span class=p>{</span>
<span class=w> </span><span class=nt>"bytes"</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>],</span>
<span class=w> </span><span class=nt>"subtype"</span><span class=p>:</span><span class=w> </span><span class=mi>42</span>
<span class=w> </span><span class=p>}</span>
<span class=p>}</span>
</code></pre></div> </details> <h3 id=ubjson><abbr title="Universal Binary JSON">UBJSON</abbr><a class=headerlink href=#ubjson title="Permanent link">&para;</a></h3> <p><a href=../binary_formats/ubjson/ ><abbr title="Universal Binary JSON">UBJSON</abbr></a> neither supports binary values nor subtypes and proposes to serialize binary values as an array of uint8 values. The library implements this translation.</p> <details class=example> <summary>Example</summary> <p>Code:</p> <div class=highlight><pre><span></span><code><span class=c1>// create a binary value of subtype 42 (will be ignored in UBJSON)</span>
<span class=n>json</span><span class=w> </span><span class=n>j</span><span class=p>;</span>
<span class=n>j</span><span class=p>[</span><span class=s>&quot;binary&quot;</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=n>j</span><span class=p>[</span><span class=s>"binary"</span><span class=p>]</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>binary</span><span class=p>({</span><span class=mh>0xCA</span><span class=p>,</span><span class=w> </span><span class=mh>0xFE</span><span class=p>,</span><span class=w> </span><span class=mh>0xBA</span><span class=p>,</span><span class=w> </span><span class=mh>0xBE</span><span class=p>},</span><span class=w> </span><span class=mi>42</span><span class=p>);</span>
<span class=c1>// convert to UBJSON</span>
<span class=k>auto</span><span class=w> </span><span class=n>v</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>to_ubjson</span><span class=p>(</span><span class=n>j</span><span class=p>);</span><span class=w> </span>
</code></pre></div> <p><code>v</code> is a <code>std::vector&lt;std::uint8_t&gt;</code> with the following 20 elements:</p> <div class=highlight><pre><span></span><code><span class=mh>0x7B</span><span class=w> </span><span class=c1>// &#39;{&#39;</span>
</code></pre></div> <p><code>v</code> is a <code>std::vector&lt;std::uint8_t&gt;</code> with the following 20 elements:</p> <div class=highlight><pre><span></span><code><span class=mh>0x7B</span><span class=w> </span><span class=c1>// '{'</span>
<span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x06</span><span class=w> </span><span class=c1>// i 6 (length of the key)</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// &quot;binary&quot;</span>
<span class=w> </span><span class=mh>0x5B</span><span class=w> </span><span class=c1>// &#39;[&#39;</span>
<span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xCA</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xFE</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xBA</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xBE</span><span class=w> </span><span class=c1>// content (each byte prefixed with &#39;U&#39;)</span>
<span class=w> </span><span class=mh>0x5D</span><span class=w> </span><span class=c1>// &#39;]&#39;</span>
<span class=mh>0x7D</span><span class=w> </span><span class=c1>// &#39;}&#39;</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// "binary"</span>
<span class=w> </span><span class=mh>0x5B</span><span class=w> </span><span class=c1>// '['</span>
<span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xCA</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xFE</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xBA</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=mh>0xBE</span><span class=w> </span><span class=c1>// content (each byte prefixed with 'U')</span>
<span class=w> </span><span class=mh>0x5D</span><span class=w> </span><span class=c1>// ']'</span>
<span class=mh>0x7D</span><span class=w> </span><span class=c1>// '}'</span>
</code></pre></div> <p>The following code uses the type and size optimization for <abbr title="Universal Binary JSON">UBJSON</abbr>:</p> <div class=highlight><pre><span></span><code><span class=c1>// convert to UBJSON using the size and type optimization</span>
<span class=k>auto</span><span class=w> </span><span class=n>v</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>json</span><span class=o>::</span><span class=n>to_ubjson</span><span class=p>(</span><span class=n>j</span><span class=p>,</span><span class=w> </span><span class=nb>true</span><span class=p>,</span><span class=w> </span><span class=nb>true</span><span class=p>);</span>
</code></pre></div> <p>The resulting vector has 23 elements; the optimization is not effective for examples with few values:</p> <div class=highlight><pre><span></span><code><span class=mh>0x7B</span><span class=w> </span><span class=c1>// &#39;{&#39;</span>
<span class=w> </span><span class=mh>0x24</span><span class=w> </span><span class=c1>// &#39;$&#39; type of the object elements</span>
<span class=w> </span><span class=mh>0x5B</span><span class=w> </span><span class=c1>// &#39;[&#39; array</span>
<span class=w> </span><span class=mh>0x23</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x01</span><span class=w> </span><span class=c1>// &#39;#&#39; i 1 number of object elements</span>
</code></pre></div> <p>The resulting vector has 23 elements; the optimization is not effective for examples with few values:</p> <div class=highlight><pre><span></span><code><span class=mh>0x7B</span><span class=w> </span><span class=c1>// '{'</span>
<span class=w> </span><span class=mh>0x24</span><span class=w> </span><span class=c1>// '$' type of the object elements</span>
<span class=w> </span><span class=mh>0x5B</span><span class=w> </span><span class=c1>// '[' array</span>
<span class=w> </span><span class=mh>0x23</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x01</span><span class=w> </span><span class=c1>// '#' i 1 number of object elements</span>
<span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x06</span><span class=w> </span><span class=c1>// i 6 (length of the key)</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// &quot;binary&quot;</span>
<span class=w> </span><span class=mh>0x24</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=c1>// &#39;$&#39; &#39;U&#39; type of the array elements: unsigned integers</span>
<span class=w> </span><span class=mh>0x23</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x04</span><span class=w> </span><span class=c1>// &#39;#&#39; i 4 number of array elements</span>
<span class=w> </span><span class=mh>0x62</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x6E</span><span class=w> </span><span class=mh>0x61</span><span class=w> </span><span class=mh>0x72</span><span class=w> </span><span class=mh>0x79</span><span class=w> </span><span class=c1>// "binary"</span>
<span class=w> </span><span class=mh>0x24</span><span class=w> </span><span class=mh>0x55</span><span class=w> </span><span class=c1>// '$' 'U' type of the array elements: unsigned integers</span>
<span class=w> </span><span class=mh>0x23</span><span class=w> </span><span class=mh>0x69</span><span class=w> </span><span class=mh>0x04</span><span class=w> </span><span class=c1>// '#' i 4 number of array elements</span>
<span class=w> </span><span class=mh>0xCA</span><span class=w> </span><span class=mh>0xFE</span><span class=w> </span><span class=mh>0xBA</span><span class=w> </span><span class=mh>0xBE</span><span class=w> </span><span class=c1>// content</span>
</code></pre></div> <p>Note that subtype (42) is <strong>not</strong> serialized and that <abbr title="Universal Binary JSON">UBJSON</abbr> has <strong>no binary type</strong>, and deserializing <code>v</code> would yield the following value:</p> <div class=highlight><pre><span></span><code><span class=p>{</span>
<span class=w> </span><span class=nt>&quot;binary&quot;</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>]</span>
<span class=w> </span><span class=nt>"binary"</span><span class=p>:</span><span class=w> </span><span class=p>[</span><span class=mi>202</span><span class=p>,</span><span class=w> </span><span class=mi>254</span><span class=p>,</span><span class=w> </span><span class=mi>186</span><span class=p>,</span><span class=w> </span><span class=mi>190</span><span class=p>]</span>
<span class=p>}</span>
</code></pre></div> </details> <!-- https://squidfunk.github.io/mkdocs-material/reference/tooltips/#adding-a-glossary --> <aside class=md-source-file> <span class=md-source-file__fact> <span class=md-icon title="Last update"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg> </span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date" title="August 7, 2026 17:29:58 UTC">August 7, 2026</span> </span> </aside> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class=md-footer> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> <div class=md-copyright__highlight> Copyright &copy; 2013-2026 Niels Lohmann </div> </div> <div class=md-social> <a href="https://github.com/nlohmann" target="_blank" rel="noopener" title="github.com" class="md-social__link"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 512"><!-- Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> <a href="https://www.linkedin.com/in/nielslohmann/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zM102.2 96a38.5 38.5 0 1 1 0 77 38.5 38.5 0 1 1 0-77m282.1 320h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> </a> <a href="https://www.xing.com/profile/Niels_Lohmann" target="_blank" rel="noopener" title="www.xing.com" class="md-social__link"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 384 512"><!-- Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7 0-12.1-7.5-8.5-14.4l69-121.3q.3 0 0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H100c7.3 0 13.3 4.1 18 12.2zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6 0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.8-Line truncated
</code></pre></div> </details> <!-- https://squidfunk.github.io/mkdocs-material/reference/tooltips/#adding-a-glossary --> <aside class=md-source-file> <span class=md-source-file__fact> <span class=md-icon title="Last update"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg> </span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date" title="August 19, 2026 18:19:47 UTC">August 19, 2026</span> </span> </aside> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class=md-footer> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> <div class=md-copyright__highlight> Copyright &copy; 2013-2026 Niels Lohmann </div> </div> <div class=md-social> <a href="https://github.com/nlohmann" target="_blank" rel="noopener" title="github.com" class="md-social__link"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 512"><!-- Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> <a href="https://www.linkedin.com/in/nielslohmann/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zM102.2 96a38.5 38.5 0 1 1 0 77 38.5 38.5 0 1 1 0-77m282.1 320h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg> </a> <a href="https://www.xing.com/profile/Niels_Lohmann" target="_blank" rel="noopener" title="www.xing.com" class="md-social__link"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 384 512"><!-- Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7 0-12.1-7.5-8.5-14.4l69-121.3q.3 0 0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H100c7.3 0 13.3 4.1 18 12.2zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6 0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.Line truncated