MySQL 8.0.39
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 |