-
Piotr Maślanka authored81e623ab
MiniJSON specification
MiniJSON is a space-aware binary encoding for a JSON.
All data is stored as bigger endian.
By char I mean uint8. By short I mean uint16. By int I mean uint32.
Type Value consists of:
-
unsigned char value
-
unsigned char * data
-
If value's highest bit is turned on, then remains are a UTF-8 string with len of (value & 0x7F)
-
If value's two highest bits are 0100 or 0101, then four lowest bits encode the number of elements, and the four highest bits encode type of the object: * 0100 - a list * 0101 - an object whose keys are all strings * 0110 - an object whose keys are not all strings (see value of 19 and 20 to know how it's
represented).
- Standard representation for a non-key-string object (value 19), string key object (value 11) or list (value 7) follows, sans the element count.
-
If value is zero, then next character is the length of the string followed by the string
-
If value is 1, then next data is signed int
-
If value is 2, then next data is signed short
-
If value is 3, then next data is signed char
-
If value is 4, then next data is unsigned int
-
If value is 5, then next data is unsigned short
-
If value is 6, then next data is unsigned char
-
If value is 7, then next data is number of elements of a list, follows by Value of each element
-
If value is 8, the value is a NULL
-
If value is 9, then next element is a IEEE single
-
If value is 10, then next element is a IEEE double
-
If value is 11, then next element is amount of entries for an object, then there goes the length of the field name, followed by field name in UTF-8, and then goes the Value of the element
-
If value is 12, then next data is unsigned int24
-
If value is 13, then next data is an unsigned short representing the count of characters, and then these characters follow and are interpreted as a UTF-8 string
-
If value is 14, then next data is an unsigned int representing the count of characters, and then these characters follow and are interpreted as a UTF-8 string
-
If value is 15, then next data is a unsigned short, and then a list follows of that many elements
-
If value is 16, then next data is a unsigned int, and then a list follows of that many elements
-
If value is 17, then next data is a unsigned short, and then an object follows of that many elements
-
If value is 18, then next data is an unsigned int, and then an object follows of that many elements
-
If value is 19, then next data is an unsigned int, and then follow that many pairs of Values (key: value)
-
If value is 20, then next data is an unsigned char, and then follow that many pairs of Values (key: value)
-
If value is 21, then next data is an unsigned short, and then follow that many pairs of Values (key: value)
-
If value is 22, then it's True
-
If value is 23, then it's False
-
- If value is 24, then next what comes is count of bytes, and then bytes follow. This is to be
-
interpreted as a signed integer
-
- If value is 25, then next comes an unsigned char denoting the length of the bytes, and
-
the remainder is binary data
-
- If value is 26, then next comes an unsigned short denoting the length of the bytes, and
-
the remainder is binary data
-
- If value is 27, then next comes an unsigned int denoting the length of the bytes, and
-
the remainder is binary data
Coder should encode the value as one having the smallest binary representation, but that is not required. Decoder must parse any arbitrary valid string.