![]()  | 
  
    MySQL 8.0.44
    
   Source Code Documentation 
   | 
 
This file specifies the interface for serializing JSON values into binary representation, and for reading values back from the binary representation. More...
#include <stddef.h>#include <cassert>#include <cstdint>#include <functional>#include <string>#include "field_types.h"#include "sql-common/json_error_handler.h"Go to the source code of this file.
Classes | |
| class | json_binary::Value | 
| Class used for reading JSON values that are stored in the binary format.  More... | |
Namespaces | |
| namespace | json_binary | 
Macros | |
| #define | EXPORT_JSON_FUNCTION | 
Functions | |
| bool | json_binary::serialize (const THD *thd, const Json_dom *dom, String *dest) | 
| Serialize the JSON document represented by dom to binary format in the destination string, replacing any content already in the destination string.  More... | |
| Value | json_binary::parse_binary (const char *data, size_t len) | 
| Parse a JSON binary document.  More... | |
| bool | json_binary::space_needed (const THD *thd, const Json_wrapper *value, bool large, size_t *needed) | 
| How much space is needed for a JSON value when it is stored in the binary format.  More... | |
| template<typename Func > | |
| bool | json_binary::for_each_node (const Value &value, const Func &func) | 
| Apply a function to every value in a JSON document.  More... | |
This file specifies the interface for serializing JSON values into binary representation, and for reading values back from the binary representation.
The binary format is as follows:
Each JSON value (scalar, object or array) has a one byte type identifier followed by the actual value.
If the value is a JSON object, its binary representation will have a header that contains:
The actual keys and values will come after the header, in the same order as in the header.
Similarly, if the value is a JSON array, the binary representation will have a header with
followed by the actual values, in the same order as in the header.
doc ::= type value
type ::=
    0x00 |       // small JSON object
    0x01 |       // large JSON object
    0x02 |       // small JSON array
    0x03 |       // large JSON array
    0x04 |       // literal (true/false/null)
    0x05 |       // int16
    0x06 |       // uint16
    0x07 |       // int32
    0x08 |       // uint32
    0x09 |       // int64
    0x0a |       // uint64
    0x0b |       // double
    0x0c |       // utf8mb4 string
    0x0f         // custom data (any MySQL data type)
value ::=
    object  |
    array   |
    literal |
    number  |
    string  |
    custom-data
object ::= element-count size key-entry* value-entry* key* value*
array ::= element-count size value-entry* value*
// number of members in object or number of elements in array
element-count ::=
    uint16 |  // if used in small JSON object/array
    uint32    // if used in large JSON object/array
// number of bytes in the binary representation of the object or array
size ::=
    uint16 |  // if used in small JSON object/array
    uint32    // if used in large JSON object/array
key-entry ::= key-offset key-length
key-offset ::=
    uint16 |  // if used in small JSON object
    uint32    // if used in large JSON object
key-length ::= uint16    // key length must be less than 64KB
value-entry ::= type offset-or-inlined-value
// This field holds either the offset to where the value is stored,
// or the value itself if it is small enough to be inlined (that is,
// if it is a JSON literal or a small enough [u]int).
offset-or-inlined-value ::=
    uint16 |   // if used in small JSON object/array
    uint32     // if used in large JSON object/array
key ::= utf8mb4-data
literal ::=
    0x00 |   // JSON null literal
    0x01 |   // JSON true literal
    0x02 |   // JSON false literal
number ::=  ....  // little-endian format for [u]int(16|32|64), whereas
                  // double is stored in a platform-independent, eight-byte
                  // format using float8store()
string ::= data-length utf8mb4-data
custom-data ::= custom-type data-length binary-data
custom-type ::= uint8   // type identifier that matches the
                        // internal enum_field_types enum
data-length ::= uint8*  // If the high bit of a byte is 1, the length
                        // field is continued in the next byte,
                        // otherwise it is the last byte of the length
                        // field. So we need 1 byte to represent
                        // lengths up to 127, 2 bytes to represent
                        // lengths up to 16383, and so on...
 | #define EXPORT_JSON_FUNCTION |