Columnar Binary JSON Files

This specification document is work-in-progress.

You see the latest version in the develop branch, as of 18th October 2019.

License

The Columnar Binary JSON specification and Libcarbon, all the source code, is released under the MIT Licsense.

Introduction

Not yet described

Getting Started

Not yet described.

Motivation

Not yet described.

Example

Not yet described.

Comparison

Not yet described.

Format Specification

Not yet described

Design Goals

Not yet described.

Notation

NotationDescriptionExample
[x]Fixed-length block x of certain number of bytes[{] an object start marker, [n] a null value, [21] an integer value, [Hello, World!] a character string
(x)Varialbe-length value x with varying bytes(len) variable-length unsigned integer encoding a length len
<x>Optional, context-dependent value x[[] <data> []] an array block [ ] with content data that may be of varying length
...Memory range of zero or more zeros[...]... an empty array block containing reserved memory, followed by (unused) reserved memory

[x], (x), and <x> are called blocks with content x.

Alternatives

Running Example

JSON snippet

{
   "title":"Back to the Future",
   "sub-title":null,
   "year":1985,
   "imdb-rating":8.5,
   "keywords":[
      "time travel",
      "delorean",
      "comedy"
   ],
   "release-dates":[
      1985, 1986, 1987,
      1992, 2008, 2010,
      2012, 2015, 2016
   ]
}

Carbon record for JSON snippet

[nokey, 1B]
[array-begin, 1B]
[object-begin, 1B]
   (str-len, 1B)[title, 5B] [string-field, 1B](str-len, 1B)[Back to the Future, 18B]
   (str-len, 1B)[sub-title, 9B] [null-field, 1B]
   (str-len, 1B)[year, 4B] [short-integer-field, 1B][1985, 2B]
   (str-len, 1B)[imdb-rating, 11B] [float-field, 1B][8.5, 4B]
   (str-len, 1B)[keywords, 8B] 
      [array-begin, 1B] 
         [string-field, 1B](str-len, 1B)[time travel, 11B] 
         [string-field, 1B](str-len, 1B)[delorean, 8B]       
         [string-field, 1B](str-len, 1B)[comedy, 6B]            
      [array-end, 1B]
   (str-len, 1B)[release-dates,13B] 
      [short-int-column, 1B](num-elems, 1B)(cap-elems, 1B)
         [1985, 2B] 
         [1986, 2B] 
         [1987, 2B]
         [1992, 2B] 
         [2008, 2B] 
         [2010, 2B]
         [2012, 2B]
         [2015, 2B]
         [2016, 2B]
[object-end, 1B] 
[array-end, 1B] 

144 byte

FormatDocument Size
Plain-Text JSON187 byte
Binary JSON (BSON)219 byte
Universal Binary JSON (UBJSON)155 byte
Columnar Binary JSON (Carbon)144 byte

Binary JSON

BSON Running Example

[object-size, 4B]
	[string-field, 1B] [title\0, 6B] [byte-num, 4B] [Back to the Future\0, 19B]
	[null-field, 1B] [sub-title\0, 10B] 
	[integer-field, 1B] [year\0, 5B] [1985, 4B]
	[float-field, 1B] [imdb-rating\0, 12B] [8.5, 8B]
	[array-field, 1B] [keywords\0, 9B] 
		[doc-size, 4 B]
			[string-field, 1B] [0\0, 2B] [byte-num, 4B] [time travel\0, 12B]
			[string-field, 1B] [1\0, 2B] [byte-num, 4B] [delorean\0, 9B]
			[string-field, 1B] [2\0, 2B] [byte-num, 4B] [comedy\0, 7B]
		[null, 1 B]
	[array-field, 1B] [release-dates\0, 9B] 
		[doc-size, 4 B]
			[integer-field, 1B] [0\0, 2B] [1985, 4B]
			[integer-field, 1B] [1\0, 2B] [1986, 4B]
			[integer-field, 1B] [2\0, 2B] [1987, 4B]
			[integer-field, 1B] [3\0, 2B] [1992, 4B]
			[integer-field, 1B] [4\0, 2B] [2008, 4B]
			[integer-field, 1B] [5\0, 2B] [2010, 4B]
			[integer-field, 1B] [6\0, 2B] [2012, 4B]
			[integer-field, 1B] [7\0, 2B] [2015, 4B]
			[integer-field, 1B] [8\0, 2B] [2016, 4B]
		[null, 1 B]
	[null, 1B]

219 byte

Comparison to Carbon

Design Goals

Commonalities

Differences

Encoding

Commonalities

Differences

Universal Binary JSON

UBJSON Running Example

(size-optimized UBJSON)

[object-begin, 1B]
   [small-int, 1B] [str-len, 1B][title, 5B] [string-field, 1B]
                        [small-int, 1B] [str-len, 1B][Back to the Future, 18B]
   [small-int, 1B] [str-len, 1B][sub-title, 9B] [null-field, 1B]
   [small-int, 1B] [str-len, 1B][year, 4B] [short-integer-field, 1B][1985, 2B]
   [small-int, 1B] [str-len, 1B][imdb-rating, 11B] [float-field, 1B][8.5, 4B]
   [small-int, 1B] [str-len, 1B][keywords, 8B] 
      [array-begin, 1B] [strong-type-marker, 1B] [string-type, 1B]
         [small-int, 1B] [str-len, 1B][time travel, 11B] 
         [small-int, 1B] [str-len, 1B][delorean, 8B]       
         [small-int, 1B] [str-len, 1B][comedy, 6B]            
      [array-end, 1B]
   [small-int, 1B] [str-len, 1B][release-dates,13B] 
      [array-begin, 1B] [count-marker, 1B] [num-elems, 1B] [strong-type-marker, 1B]
         [1985, 2B] 
         [1986, 2B] 
         [1987, 2B]
         [1992, 2B] 
         [2008, 2B] 
         [2010, 2B]
         [2012, 2B]
         [2015, 2B]
         [2016, 2B]
[object-end, 1B]  

155 byte

Comparison to Carbon

Design Goals

Commonalities

Differences

  • UBJSON is not intented for writes, while Carbon emphasises in-place modifications including (optional) reserved memory ranges as capacity buffers to avoid reallocation during updates
  • No specification on update semantics for UBJSON, while there is a detailed specification on atomic operations, update behavior and version control for Carbon

Encoding

Commonalities

  • Carbon and UBJSON are very similar in its core structure (similar containers in general), similar use of markers.
  • Support of constrainted arrays ("strongly typed arrays"), but with different optimization goals in mind

Differences

In direct comparison, Carbon focus more on semantics (e.g., embedding additional meta-data) and focus more on support for operations of typical operational document stores (e.g., on-the-fly updates), while UBJSON focusses on efficient data exchange between two actors. Both, Carbon and UBJSON share the concept of a minimalistic type-support to have full compatibility to the latest JSON specification. However, Carbon adds one additional data type (custom) binary to enable user-defined function (UDF) support on user-defined types, though.

  • Carbon supports three-valued logic for boolean values, and encodes null values not only for the JSON constant null but also as valid value in strongly typed arrays (e.g., intermixing of null and number values in column containers of Carbon). UBJSON cannot store a null value in a strongly typed array of a particular non-null type, and must fallback to size-inefficient standard arrays in UBJSON.
  • Variable-length integer encoding for string lengths, or counters in Carbon
  • Encoding of binary data: while in UBJON a (strongly typed) unsigned 8-bit integer array is used, in Carbon there is a dedicated type binary (resp. custom binary) that encoded the actual binary string data type (i.e., the what is stored information gets not lost in Carbon as it does in UBJSON)
  • Revision numbering as dedicated (variable-length) meta-data field in Carbon
  • Record identification via (optional) primary key as meta-data field in Carbon, and defined semantic about record identity
  • Overall, typically smaller binary size for Carbon files compared to UBJSON files
  • For Carbon, the evaluation of dot-path expressions is well-defined and specified
  • Carbon specificies two way to express absence of data, null and undef where the first one maps to user-defined data and the second is a dedicated result value for dot-path expressions.

Format Overview

<primary-key> [commit-hash] [[] <values>... []]...

Figure FO-1: Carbon File Record Format

A marker x has always a size of 1 byte.

Document Identification

<primary-key>

See more about identity of Carbon records in the Section about Identification.

Revision Managment

[commit-hash]

The commit-hash field for a carbon record which has no primary key (i.e., nokey is set), is omitted. In any case of revison, the commit hash of a record without primary key is 0. See more in section about record identification.

The commit-hash field requires 64bit.

The initial commit hash for an new record having some primary key type, is a (almost global) unique randomly generated number.

Values

<values>

Capacitities

...

Examples

Example (Array)

JSON snippet

[ "The", "Number", 23 ]

A (compacted) Carbon record with user-defined primary key 21 in revision 5 encoding the JSON array as array.

[ukey][21](5) [[] [s](3)[The] [s](6)[Number] [c][23] []] 

Example (Column)

JSON snippet

[ 23, 24, 25 ]

A (compacted) Carbon record with user-defined primary key 21 in revision 5 encoding the JSON array as column-u8 integer column with 3 elements and a capacity of 3.

[ukey][21](5) [1](3)(3) [23][24][25] []] 

Marker Format

[marker]
Carbon TypeDescriptionSizeExamples
markerconstant for encoding of items and containers1 byte[n], [[], [x]

Reserved Marker

MarkerCarbon TypeDescriptions
[t]truea field truth value true
[f]falsea field truth value false
[c]u8an unsigned 8-bit integer field
[d]u16an unsigned 16-bit integer field
[i]u32an unsigned 32-bit integer field
[l]u64an unsigned 64-bit integer field
[C]u8a signed 8-bit integer field
[D]u16a signed 16-bit integer field
[I]u32a signed 32-bit integer field
[L]u64a signed 64-bit integer field
[r]floata single-precision floating number field
[s]stringa character string field
[b]binarya binary string field with known MIME type
[x]custom binarya binary string field with user-defined type
[n]nullabsence of data

Figure MF-1: Data Type Markers

MarkerCarbon TypeDescriptions
[{]objectmarks begin of an object
[}]objectmarks end of an object
[[]arraymarks begin of an array
[]]arraymarks end of an array
[1]column-u8an unsigned 8-bit integer column
[2]column-u16an unsigned 16-bit integer column
[3]column-u32an unsigned 32-bit integer column
[4]column-u64an unsigned 64-bit integer column
[5]column-i8an signed 8-bit integer column
[6]column-i16an signed 16-bit integer column
[7]column-i32an signed 32-bit integer column
[8]column-i64an signed 64-bit integer column
[R]column-floata single-precision floating number column
[B]column-booleana three-valued logic column

Figure MF-2: Container Type Markers

Begin MarkerAbstract TypeBaseContainerElementDistinctSorted
[{]unsorted-multimapyesobjectpairnono
[~]sorted-multimapnoobjectpairnoyes
[:]unsorted-mapnoobjectpairyesno
[#]sorted-mapnoobjectpairyesyes

Figure MF-2: Abstract Types on object containers

Begin MarkerAbstract TypeBaseContainerElementDistinctSorted
[[]unsorted-multisetyesarrayvaluenono
[<]sorted-multisetnoarrayvaluenoyes
[/]unsorted-setnoarrayvalueyesno
[=]sorted-setnoarrayvalueyesyes

Figure MF-2: Abstract Types on array containers

Begin MarkerAbstract TypeBaseContainerElementDistinctSorted
[1]unsorted-multisetyescolumn-u8valuenono
[SOH]sorted-multisetnocolumn-u8valuenoyes
[STX]unsorted-setnocolumn-u8valueyesno
[ETX]sorted-setnocolumn-u8valueyesyes
[2]unsorted-multisetyescolumn-u16valuenono
[ENQ]sorted-multisetnocolumn-u16valuenoyes
[ACK]unsorted-setnocolumn-u16valueyesno
[BEL]sorted-setnocolumn-u16valueyesyes
[3]unsorted-multisetyescolumn-u32valuenono
[TAB]sorted-multisetnocolumn-u32valuenoyes
[LF]unsorted-setnocolumn-u32valueyesno
[VT]sorted-setnocolumn-u32valueyesyes
[4]unsorted-multisetyescolumn-u64valuenono
[CR]sorted-multisetnocolumn-u64valuenoyes
[S0]unsorted-setnocolumn-u64valueyesno
[S1]sorted-setnocolumn-u64valueyesyes
[5]unsorted-multisetyescolumn-i8valuenono
[DC1]sorted-multisetnocolumn-i8valuenoyes
[DC2]unsorted-setnocolumn-i8valueyesno
[DC3]sorted-setnocolumn-i8valueyesyes
[6]unsorted-multisetyescolumn-i16valuenono
[NAK]sorted-multisetnocolumn-i16valuenoyes
[SYN]unsorted-setnocolumn-i16valueyesno
[ETB]sorted-setnocolumn-i16valueyesyes
[7]unsorted-multisetyescolumn-i32valuenono
[EM]sorted-multisetnocolumn-i32valuenoyes
[SUB]unsorted-setnocolumn-i32valueyesno
[ESC]sorted-setnocolumn-i32valueyesyes
[8]unsorted-multisetyescolumn-i64valuenono
[GS]sorted-multisetnocolumn-i64valuenoyes
[RS]unsorted-setnocolumn-i64valueyesno
[US]sorted-setnocolumn-i64valueyesyes
[R]unsorted-multisetyescolumn-floatvaluenono
["]sorted-multisetnocolumn-floatvaluenoyes
[$]unsorted-setnocolumn-floatvalueyesno
[.]sorted-setnocolumn-floatvalueyesyes
[B]unsorted-multisetyescolumn-booleanvaluenono
[_]sorted-multisetnocolumn-booleanvaluenoyes
[']unsorted-setnocolumn-booleanvalueyesno
[DEL]sorted-setnocolumn-booleanvalueyesyes

Figure MF-2: Abstract Types on column containers

MarkerCarbon TypeDescriptions
[?]nokeyno record identifier assigned
[*]autokeyrecord identifier is auto-generated a u64 value
[+]ukeyrecord identifier is user-defined a u64 value
[-]ikeyrecord identifier is user-defined a i64 value
[!]ikeyrecord identifier is user-defined a string value

Figure MF-3: Record Identifier Type Markers

MarkerCarbon TypeDescriptions
[0]reservedmarks a single reserved byte

Figure MF-4: Special Purpose Markers

[NUL], [EOT], [BS], [FF], [DLE], [DC4], [CAN], [FS], [^], [\], [@] 

Figure MF-4: Unused but reserved Markers

Variable-Length Integers

(value)

Not yet described.

Padding Spaces

Not yet described.

BNF Syntax

Not yet described.

Identification

<primary-key>
<type-marker> <value-type>
Carbon TypeDescriptionSizeType MarkerValue Type
nokeyno identifier assigned0 B[?]none
autokey64-bit auto-generated unsigned identifier8 B[*]u64
ukey64-bit user-defined unsigned identifier8 B[+]u64
ikey64-bit user-defined signed identifier8 B[-]i64
skeyn-char string user-def. identifiern B[!]string

Table FO-1: Record Primary Key Types and Encoding

The value generation of autokey is implementation-dependent.

The default value for numeric keys (autokey, ukey, and ikey) is 0. The empty string "" is used to encode the default value for character string keys (skey). JSON formatters are required to format the value of nokey and the default value for character string keys as JSON null.

If nokey is set, the commit-hash field for a carbon record is omitted. In any case of revison, the commit hash for such a record is 0.

User-Defined Keys

Not yet described.

System-Defined Keys

Not yet described.

Data Types

Carbon TypeDescriptionSizenull-ValueMarker
truetruth value true0 bytenull[t]
falsetruth value false0 bytenull[f]
booleanthree-valued logic0+ bytesconst[B]
u8unsigned 8-bit int1 Bnull, 28 - 1[c], [1]
u16unsigned 16-bit int2 Bnull, 216 - 1[d], [2]
u32unsigned 32-bit int4 Bnull, 216 - 1[i], [3]
u64unsigned 64-bit int8 Bnull, 216 - 1[l], [4]
i8signed 8-bit int1 Bnull, -27[C], [5]
i16signed 16-bit int2 Bnull, -215[D], [6]
i32signed 32-bit int4 Bnull, -231[I], [7]
i64signed 64-bit int8 Bnull, -263[L], [8]
float32-bit float4 bytenull, NAN[r], [R]
stringstring of n charsn bytesnull[s]
binarybinary of n bytesn + 2+ bytesnull[b]
custom binarybinary of n bytesn + 3+ bytesnull[x]
nullabsence of data (user-defined)0+ bytenull[n]
undefabsence of data (structure-defined)0 bytenone[N]

Null and Undef

In carbon, there are two way to express absence of data, null and undef. The first one, null, is a mapping of the Json constant null, and is used to express non-present data by the user, e.g., by the Json string "x": null. In contrast, the second one, undef is used to express absence of data that is not only annotated as non-present, but in fact not contained. In no cases, the user can express a undef with its input, but will receive a undef (i.e., "not in list") value whenever the user queries for non-existing data by a dot path expression.

The reason for differencing between null and undef is to enable clear semantic whether a particular dot path expression evaluates to a value that is stored within the record and which is annotated with absence of data by the user (i.e., using a null), or to a value that is not contained in the dataset (i.e., a undef is return).

To ephasis the differences and importance of undef and null, consider the following example

{
    "x": null
}

Using a dot path expression asking for the value of the property "x" will result in null since "x" is a valid path that evaluates to a particular value. In contrast, asking for the value of an non-existing property "y" will result in undef since "y" does not exist.

Booleans

Carbon TypeDescriptionSizenull-ValueMarker
truethe truth value true0 bytenull[t]
falsethe truth value false0 bytenull[f]
booleana three-valued value0+ bytesdedicated valuededicated value

Encoding as Field Value

Example

JSON snippet

[true, false]

A (compacted) Carbon array

[[] [t] [f] []]

Encoding as Column Value

Column Type MarkerMarker SizeValueElement SizeBlock
[B], boolean values1-bytefalse1 byte each[0]
[B], boolean values1-bytetrue1 byte each[1]
[B], boolean values1-bytenull1 byte each[2]

Example

JSON snippet

[false, true, null]

A (compacted) Carbon column-boolean.

[B](3)(3) [0][1][2]

Integer Numbers

CarbonDescriptionSizeMinMaxnull-ValueMarker
u8unsigned 8-bit int1 B028 - 2null or 28 - 1[c]
u16unsigned 16-bit int2 B0216 - 2null or216 - 1[d]
u32unsigned 32-bit int4 B0216 - 2null or216 - 1[i]
u64unsigned 64-bit int8 B0216 - 2null or216 - 1[l]
i8signed 8-bit int1 B−27 + 127 - 2null or-27[C]
i16signed 16-bit int2 B−215 + 1215 - 2null or-215[D]
i32signed 32-bit int4 B−231 + 1231 - 2null or-231[I]
i64signed 64-bit int8 B−263 + 1263 - 2null or-263[L]

Encoding as Field Value

Example

JSON snippet

[-42, 42, null]

A (compacted) Carbon file, which encodes the JSON array as array of one i8 and one u8 value.

[[] [c][-42] [C][42] [n] []]

Encoding as Column Value

Example

JSON snippet

[-42, 42, null]

A (compacted) Carbon column-8.

[C](3)(3) [-42][42][255]

Floating Numbers

Carbon TypeDescriptionSizenull-ValueMarker
floatsingle-precision floating number4 bytenull or NANr

Encoding as Field Value

DescriptionSizeMarkerPayload
32-bit floating number1+4 bytes[r] (real)a float value

Example

JSON snippet

[23.3, 42.0]

A (compacted) Carbon file, which encodes the JSON array as array of one i8 and one u8 integer.

[[] [r][23.3] [r][42.0] []]

Encoding as Column Value

Column Type MarkerElement SizeBlock
[R], 32-bit floating numbers4 byte eacha float value

Example

JSON snippet

[23.3, 42.0]

A (compacted) Carbon column-float.

[R] (2)(2) [23.3][42.0]

Character Strings

Carbon TypeDescriptionSizenull-ValueMarker
stringa (Pascal) character string of n charactersn bytesnull[s]

Encoding as Field Value

[s](n) <character-string>
DescriptionSizeMarkerPayload
a n-char string1 + l + n bytes[s] (string)(n) length (l byte), n chars

Example

JSON snippet

["Hello", "World", "!"]

A (compacted) Carbon file, which encodes the JSON array as array of character-string values.

[[] [s](5)[Hello] [s](5)[World] [s](1)[!] []]

Encoding as Column Value

Character strings are not supported for column containers.

Binary Strings

Carbon TypeDescriptionSizenull-ValueMarker
binarybinary of n bytes (MIME typed)n + 2+ bytesnull[b]
custom binarybinary of n bytes (custom type)n + 3+ bytesnull[x]

Encoding As Field Value

With Known MIME Types

[b](mime-type-id)(str-len) <binary>
DescriptionSize (in Byte)MarkerPayload
binary of n bytes1 + k + l + n[b] (binary)see below
PayloadDescriptionEncoding TypeSize
(mime-type-id)MIME Type Id (see below)variable-length integerk byte
(str-len)binary string length in bytesvariable-length integerl byte
<binary>the binary string itselffixed-sized binary stringn byte

Example

snippet

MIME Type:	text/html
Content:	<html><body><p>Hello, World!</p></body></html>

A (compacted) Carbon file, which encodes the HTML code as binary.

[b](219)(46) [<html><body><p>Hello, World!</p></body></html>]

With Unknown MIME Types

[x](type-str-len)<type-str>(str-len) <binary-string>
DescriptionSize (in Byte)MarkerPayload
binary of n bytes1 + p + q + l + n[x] (custom binary)see below
PayloadDescriptionEncoding TypeSize
(type-str-len)used-def type string lengthvariable-length integerk byte
<type-str>the user-def type string itselffixed-sized stringq byte
(str-len)binary string length in bytesvariable-length integerl byte
<binary>the binary string itselffixed-sized binary stringn byte

Example

snippet

Type Name:      custom-type
Content:        c3RpbGwgYSBzZWNyZXQ=

A (compacted) Carbon file, which encodes the HTML code as binary.

[x](11)[custom-type](20) [c3RpbGwgYSBzZWNyZXQ=]

Parsing from JSON

JSON does not support the definition of binary or custom binary types as used in Carbon. To enable conversion from JSON that describes (custom) binary Carbon types, the follow convention is used.

A binary is encoded in JSON using an JSON object with exactly the following string properties:

  • type store a (custom) type description
  • encoding stores the value base64
  • binary-string stores a base64-encoded binary value

A particular order of these properties inside the object is not required. Once an object satisfying the definition from above was found, the object is replaced with a (custom) binary type (called auto-conversion). If the string type matches a built-in MIME type (see blow) by character equality, and the auto-conversion option is not turned off, a binary type with the described contents is created. Otherwise a custom binary is created.

Libaries implementing the Carbon specification must provide an option to turn off auto-conversion, such that there is a possibility to still store an object satisfying the definition from above without converting its content to a (custom) (binary) type.

JSON snippet

{
   "type":"text/html",
   "encoding":"base64",
   "binary-string":"PGh0bWw+PGJvZHk+PHA+SGVsbG8sIFdvcmxkITwvcD48L2JvZHk+PC9odG1sPgAA"
}

Carbon file snippet

[b](219)(46) [<html><body><p>Hello, World!</p></body></html>]

Vice versa, a Carbon file converted into a JSON string using the standard JSON formatter will produce the JSON snippet from above for the Carbon file snippet from above.

TODO: Not yet implemented

Encoding As Column Value

Binary strings are not supported for column containers.

MIME Type Ids

Note: To the point of this writing, the MIME type to identifier mapping is done via alphanumeric ordering of MIME type strings for improved lookup performance given a particular mime type string. In a future specification version, the order may change to reflect likelihood of certain type strings. With simpler words, to minimmize the variable number of bytes used to encode a MIME type id, more often used mime type strings will be assigned to a lower MIME type id compared to less-frequent used mime types.

MIME TypeFile ExtensionMIME Type Id
application/vnd.lotus-1-2-31230
text/vnd.in3d.3dml3dml1
video/3gpp23g22
video/3gpp3gp3
application/x-7z-compressed7z4
application/x-authorware-binaab5
audio/x-aacaac6
application/x-authorware-mapaam7
application/x-authorware-segaas8
application/x-abiwordabw9
application/pkix-attr-certac10
application/vnd.americandynamics.accacc11
application/x-ace-compressedace12
application/vnd.acucobolacu13
audio/adpcmadp14
application/vnd.audiographaep15
application/vnd.ibm.modcapafp16
application/vnd.ahead.spaceahead17
application/postscriptai18
audio/x-aiffaif19
application/vnd.adobe.air-application-installer-package+zipair20
application/vnd.dvb.aitait21
application/vnd.amiga.amiami22
application/vnd.android.package-archiveapk23
application/x-ms-applicationapplication24
application/vnd.lotus-approachapr25
video/x-ms-asfasf26
application/vnd.accpac.simply.asoaso27
application/vnd.acucorpatc28
application/atom+xmlatom29
application/atomcat+xmlatomcat30
application/atomsvc+xmlatomsvc31
application/vnd.antix.game-componentatx32
audio/basicau33
video/x-msvideoavi34
application/applixwareaw35
application/vnd.airzip.filesecure.azfazf36
application/vnd.airzip.filesecure.azsazs37
application/vnd.amazon.ebookazw38
application/x-bcpiobcpio39
application/x-font-bdfbdf40
application/vnd.syncml.dm+wbxmlbdm41
application/vnd.realvnc.bedbed42
application/vnd.fujitsu.oasysprsbh243
application/octet-streambin44
application/vnd.bmibmi45
image/bmpbmp46
application/vnd.previewsystems.boxbox47
image/prs.btifbtif48
application/x-bzipbz49
application/x-bzip2bz250
text/x-cc51
application/vnd.cluetrust.cartomobile-configc11amc52
application/vnd.cluetrust.cartomobile-config-pkgc11amz53
application/vnd.clonk.c4groupc4g54
application/vnd.ms-cab-compressedcab55
application/vnd.curl.carcar56
application/vnd.ms-pki.seccatcat57
application/vnd.contact.cmsgcdbcmsg58
application/vnd.mediastation.cdkeycdkey59
application/cdmi-capabilitycdmia60
application/cdmi-containercdmic61
application/cdmi-domaincdmid62
application/cdmi-objectcdmio63
application/cdmi-queuecdmiq64
chemical/x-cdxcdx65
application/vnd.chemdraw+xmlcdxml66
application/vnd.cinderellacdy67
application/pkix-certcer68
image/cgmcgm69
application/x-chatchat70
application/vnd.ms-htmlhelpchm71
application/vnd.kde.kchartchrt72
chemical/x-cifcif73
application/vnd.anser-web-certificate-issue-initiationcii74
application/vnd.ms-artgalrycil75
application/vnd.claymorecla76
application/java-vmclass77
application/vnd.crick.clicker.keyboardclkk78
application/vnd.crick.clicker.paletteclkp79
application/vnd.crick.clicker.templateclkt80
application/vnd.crick.clicker.wordbankclkw81
application/vnd.crick.clickerclkx82
application/x-msclipclp83
application/vnd.cosmocallercmc84
chemical/x-cmdfcmdf85
chemical/x-cmlcml86
application/vnd.yellowriver-custom-menucmp87
image/x-cmxcmx88
application/vnd.rim.codcod89
application/x-cpiocpio90
application/mac-compactprocpt91
application/x-mscardfilecrd92
application/pkix-crlcrl93
application/vnd.rig.cryptonotecryptonote94
application/x-cshcsh95
chemical/x-csmlcsml96
application/vnd.commonspacecsp97
text/csscss98
text/csvcsv99
application/cu-seemecu100
text/vnd.curlcurl101
application/prs.cwwcww102
model/vnd.collada+xmldae103
application/vnd.mobius.dafdaf104
application/davmount+xmldavmount105
text/vnd.curl.dcurldcurl106
application/vnd.oma.dd2+xmldd2107
application/vnd.fujixerox.dddddd108
application/x-debian-packagedeb109
application/x-x509-ca-certder110
application/vnd.dreamfactorydfac111
application/x-directordir112
application/vnd.mobius.disdis113
image/vnd.djvudjvu114
application/x-apple-diskimagedmg115
application/vnd.dnadna116
application/msworddoc117
application/vnd.ms-word.document.macroenabled.12docm118
application/vnd.openxmlformats-officedocument.wordprocessingml.documentdocx119
application/vnd.ms-word.template.macroenabled.12dotm120
application/vnd.openxmlformats-officedocument.wordprocessingml.templatedotx121
application/vnd.osgi.dpdp122
application/vnd.dpgraphdpg123
audio/vnd.dradra124
text/prs.lines.tagdsc125
application/dssc+derdssc126
application/x-dtbook+xmldtb127
application/xml-dtddtd128
audio/vnd.dtsdts129
audio/vnd.dts.hddtshd130
application/x-dvidvi131
model/vnd.dwfdwf132
image/vnd.dwgdwg133
image/vnd.dxfdxf134
application/vnd.spotfire.dxpdxp135
audio/vnd.nuera.ecelp4800ecelp4800136
audio/vnd.nuera.ecelp7470ecelp7470137
audio/vnd.nuera.ecelp9600ecelp9600138
application/vnd.novadigm.edmedm139
application/vnd.novadigm.edxedx140
application/vnd.picselefif141
application/vnd.pg.osasliei6142
message/rfc822eml143
application/emma+xmlemma144
audio/vnd.digital-windseol145
application/vnd.ms-fontobjecteot146
application/epub+zipepub147
application/ecmascriptes148
application/vnd.eszigno3+xmles3149
application/vnd.epson.esfesf150
text/x-setextetx151
application/x-msdownloadexe152
application/exiexi153
application/vnd.novadigm.extext154
application/vnd.ezpix-albumez2155
application/vnd.ezpix-packageez3156
text/x-fortranf157
video/x-f4vf4v158
image/vnd.fastbidsheetfbs159
application/vnd.isac.fcsfcs160
application/vnd.fdffdf161
application/vnd.denovo.fcselayout-linkfe_launch162
application/vnd.fujitsu.oasysgpfg5163
image/x-freehandfh164
application/x-xfigfig165
video/x-flifli166
application/vnd.micrografx.floflo167
video/x-flvflv168
application/vnd.kde.kivioflw169
text/vnd.fmi.flexstorflx170
text/vnd.flyfly171
application/vnd.framemakerfm172
application/vnd.frogans.fncfnc173
image/vnd.fpxfpx174
application/vnd.fsc.weblaunchfsc175
image/vnd.fstfst176
application/vnd.fluxtime.clipftc177
application/vnd.anser-web-funds-transfer-initiationfti178
video/vnd.fvtfvt179
application/vnd.adobe.fxpfxp180
application/vnd.fuzzysheetfzs181
application/vnd.geoplang2w182
image/g3faxg3183
application/vnd.geospaceg3w184
application/vnd.groove-accountgac185
model/vnd.gdlgdl186
application/vnd.dynageogeo187
application/vnd.geometry-explorergex188
application/vnd.geogebra.fileggb189
application/vnd.geogebra.toolggt190
application/vnd.groove-helpghf191
image/gifgif192
application/vnd.groove-identity-messagegim193
application/vnd.gmxgmx194
application/x-gnumericgnumeric195
application/vnd.flographitgph196
application/vnd.grafeqgqf197
application/srgsgram198
application/vnd.groove-injectorgrv199
application/srgs+xmlgrxml200
application/x-font-ghostscriptgsf201
application/x-gtargtar202
application/vnd.groove-tool-messagegtm203
model/vnd.gtwgtw204
text/vnd.graphvizgv205
application/vnd.geonextgxt206
video/h261h261207
video/h263h263208
video/h264h264209
application/vnd.hal+xmlhal210
application/vnd.hbcihbci211
application/x-hdfhdf212
application/winhlphlp213
application/vnd.hp-hpglhpgl214
application/vnd.hp-hpidhpid215
application/vnd.hp-hpshps216
application/mac-binhex40hqx217
application/vnd.kenameaapphtke218
text/htmlhtml219
application/vnd.yamaha.hv-dichvd220
application/vnd.yamaha.hv-voicehvp221
application/vnd.yamaha.hv-scripthvs222
application/vnd.intergeoi2g223
application/vnd.iccprofileicc224
x-conference/x-cooltalkice225
image/x-iconico226
text/calendarics227
image/iefief228
application/vnd.shana.informed.formdataifm229
application/vnd.igloaderigl230
application/vnd.insors.igmigm231
model/igesigs232
application/vnd.micrografx.igxigx233
application/vnd.shana.informed.interchangeiif234
application/vnd.accpac.simply.impimp235
application/vnd.ms-imsims236
application/ipfixipfix237
application/vnd.shana.informed.packageipk238
application/vnd.ibm.rights-managementirm239
application/vnd.irepository.package+xmlirp240
application/vnd.shana.informed.formtemplateitp241
application/vnd.immervision-ivpivp242
application/vnd.immervision-ivuivu243
text/vnd.sun.j2me.app-descriptorjad244
application/vnd.jamjam245
application/java-archivejar246
text/x-java-sourcejava247
application/vnd.jispjisp248
application/vnd.hp-jlytjlt249
application/x-java-jnlp-filejnlp250
application/vnd.joost.joda-archivejoda251
image/jpegjpeg252
video/jpegjpgv253
video/jpmjpm254
application/javascriptjs255
application/jsonjson256
application/vnd.kde.karbonkarbon257
application/vnd.kde.kformulakfo258
application/vnd.kidspirationkia259
application/vnd.google-earth.kml+xmlkml260
application/vnd.google-earth.kmzkmz261
application/vnd.kinarkne262
application/vnd.kde.kontourkon263
application/vnd.kde.kpresenterkpr264
application/vnd.kde.kspreadksp265
image/ktxktx266
application/vnd.kahootzktz267
application/vnd.kde.kwordkwd268
application/vnd.las.las+xmllasxml269
application/x-latexlatex270
application/vnd.llamagraphics.life-balance.desktoplbd271
application/vnd.llamagraphics.life-balance.exchange+xmllbe272
application/vnd.hhe.lesson-playerles273
application/vnd.route66.link66+xmllink66274
application/vnd.ms-lrmlrm275
application/vnd.frogans.ltfltf276
audio/vnd.lucent.voicelvp277
application/vnd.lotus-wordprolwp278
application/mp21m21279
audio/x-mpegurlm3u280
application/vnd.apple.mpegurlm3u8281
video/x-m4vm4v282
application/mathematicama283
application/mads+xmlmads284
application/vnd.ecowin.chartmag285
application/mathml+xmlmathml286
application/vnd.mobius.mbkmbk287
application/mboxmbox288
application/vnd.medcalcdatamc1289
application/vnd.mcdmcd290
text/vnd.curl.mcurlmcurl291
application/x-msaccessmdb292
image/vnd.ms-modimdi293
application/metalink4+xmlmeta4294
application/mets+xmlmets295
application/vnd.mfmpmfm296
application/vnd.osgeo.mapguide.packagemgp297
application/vnd.proteus.magazinemgz298
audio/midimid299
application/vnd.mifmif300
video/mj2mj2301
application/vnd.dolby.mlpmlp302
application/vnd.chipnuts.karaoke-mmdmmd303
application/vnd.smafmmf304
image/vnd.fujixerox.edmics-mmrmmr305
application/x-msmoneymny306
application/mods+xmlmods307
video/x-sgi-moviemovie308
application/mp4mp4309
application/vnd.mophun.certificatempc310
video/mpegmpeg311
audio/mpegmpga312
application/vnd.apple.installer+xmlmpkg313
application/vnd.blueice.multipassmpm314
application/vnd.mophun.applicationmpn315
application/vnd.ms-projectmpp316
application/vnd.ibm.minipaympy317
application/vnd.mobius.mqymqy318
application/marcmrc319
application/marcxml+xmlmrcx320
application/mediaservercontrol+xmlmscml321
application/vnd.mseqmseq322
application/vnd.epson.msfmsf323
model/meshmsh324
application/vnd.mobius.mslmsl325
application/vnd.muvee.stylemsty326
model/vnd.mtsmts327
application/vnd.musicianmus328
application/vnd.recordare.musicxml+xmlmusicxml329
application/x-msmediaviewmvb330
application/vnd.mfermwf331
application/mxfmxf332
application/vnd.recordare.musicxmlmxl333
application/xv+xmlmxml334
application/vnd.triscape.mxsmxs335
video/vnd.mpegurlmxu336
application/vnd.nokia.n-gage.symbian.installn-gage337
text/n3n3338
application/vnd.wolfram.playernbp339
application/x-netcdfnc340
application/x-dtbncx+xmlncx341
application/vnd.nokia.n-gage.datangdat342
application/vnd.neurolanguage.nlunlu343
application/vnd.enlivennml344
application/vnd.noblenet-directorynnd345
application/vnd.noblenet-sealernns346
application/vnd.noblenet-webnnw347
image/vnd.net-fpxnpx348
application/vnd.lotus-notesnsf349
application/vnd.fujitsu.oasys2oa2350
application/vnd.fujitsu.oasys3oa3351
application/vnd.fujitsu.oasysoas352
application/x-msbinderobd353
application/odaoda354
application/vnd.oasis.opendocument.databaseodb355
application/vnd.oasis.opendocument.chartodc356
application/vnd.oasis.opendocument.formulaodf357
application/vnd.oasis.opendocument.formula-templateodft358
application/vnd.oasis.opendocument.graphicsodg359
application/vnd.oasis.opendocument.imageodi360
application/vnd.oasis.opendocument.text-masterodm361
application/vnd.oasis.opendocument.presentationodp362
application/vnd.oasis.opendocument.spreadsheetods363
application/vnd.oasis.opendocument.textodt364
audio/oggoga365
video/oggogv366
application/oggogx367
application/onenoteonetoc368
application/oebps-package+xmlopf369
application/vnd.lotus-organizerorg370
application/vnd.yamaha.openscoreformatosf371
application/vnd.yamaha.openscoreformat.osfpvg+xmlosfpvg372
application/vnd.oasis.opendocument.chart-templateotc373
application/x-font-otfotf374
application/vnd.oasis.opendocument.graphics-templateotg375
application/vnd.oasis.opendocument.text-weboth376
application/vnd.oasis.opendocument.image-templateoti377
application/vnd.oasis.opendocument.presentation-templateotp378
application/vnd.oasis.opendocument.spreadsheet-templateots379
application/vnd.oasis.opendocument.text-templateott380
application/vnd.openofficeorg.extensionoxt381
text/x-pascalp382
application/pkcs10p10383
application/x-pkcs12p12384
application/x-pkcs7-certificatesp7b385
application/pkcs7-mimep7m386
application/x-pkcs7-certreqrespp7r387
application/pkcs7-signaturep7s388
application/pkcs8p8389
text/plain-baspar390
application/vnd.pawaafilepaw391
application/vnd.powerbuilder6pbd392
image/x-portable-bitmappbm393
application/x-font-pcfpcf394
application/vnd.hp-pclpcl395
application/vnd.hp-pclxlpclxl396
application/vnd.curl.pcurlpcurl397
image/x-pcxpcx398
application/vnd.palmpdb399
application/pdfpdf400
application/x-font-type1pfa401
application/font-tdpfrpfr402
image/x-portable-graymappgm403
application/x-chess-pgnpgn404
application/pgp-encryptedpgp405
image/x-pictpic406
image/pjpegpjpeg407
application/pkixcmppki408
application/pkix-pkipathpkipath409
application/vnd.3gpp.pic-bw-largeplb410
application/vnd.mobius.plcplc411
application/vnd.pocketlearnplf412
application/pls+xmlpls413
application/vnd.ctc-posmlpml414
image/pngpng415
image/x-portable-anymappnm416
application/vnd.macports.portpkgportpkg417
application/vnd.ms-powerpoint.template.macroenabled.12potm418
application/vnd.openxmlformats-officedocument.presentationml.templatepotx419
application/vnd.ms-powerpoint.addin.macroenabled.12ppam420
application/vnd.cups-ppdppd421
image/x-portable-pixmapppm422
application/vnd.ms-powerpoint.slideshow.macroenabled.12ppsm423
application/vnd.openxmlformats-officedocument.presentationml.slideshowppsx424
application/vnd.ms-powerpointppt425
application/vnd.ms-powerpoint.presentation.macroenabled.12pptm426
application/vnd.openxmlformats-officedocument.presentationml.presentationpptx427
application/x-mobipocket-ebookprc428
application/vnd.lotus-freelancepre429
application/pics-rulesprf430
application/vnd.3gpp.pic-bw-smallpsb431
image/vnd.adobe.photoshoppsd432
application/x-font-linux-psfpsf433
application/pskc+xmlpskcxml434
application/vnd.pvi.ptid1ptid435
application/x-mspublisherpub436
application/vnd.3gpp.pic-bw-varpvb437
application/vnd.3m.post-it-notespwn438
audio/vnd.ms-playready.media.pyapya439
video/vnd.ms-playready.media.pyvpyv440
application/vnd.epson.quickanimeqam441
application/vnd.intu.qboqbo442
application/vnd.intu.qfxqfx443
application/vnd.publishare-delta-treeqps444
video/quicktimeqt445
application/vnd.quark.quarkxpressqxd446
audio/x-pn-realaudioram447
application/x-rar-compressedrar448
image/x-cmu-rasterras449
application/vnd.ipunplugged.rcprofilercprofile450
application/rdf+xmlrdf451
application/vnd.data-vision.rdzrdz452
application/vnd.businessobjectsrep453
application/x-dtbresource+xmlres454
image/x-rgbrgb455
application/reginfo+xmlrif456
audio/vnd.riprip457
application/resource-lists+xmlrl458
image/vnd.fujixerox.edmics-rlcrlc459
application/resource-lists-diff+xmlrld460
application/vnd.rn-realmediarm461
audio/x-pn-realaudio-pluginrmp462
application/vnd.jcp.javame.midlet-rmsrms463
application/relax-ng-compact-syntaxrnc464
application/vnd.cloanto.rp9rp9465
application/vnd.nokia.radio-presetsrpss466
application/vnd.nokia.radio-presetrpst467
application/sparql-queryrq468
application/rls-services+xmlrs469
application/rsd+xmlrsd470
application/rss+xmlrss471
application/rtfrtf472
text/richtextrtx473
text/x-asms474
application/vnd.yamaha.smaf-audiosaf475
application/sbml+xmlsbml476
application/vnd.ibm.secure-containersc477
application/x-msschedulescd478
application/vnd.lotus-screencamscm479
application/scvp-cv-requestscq480
application/scvp-cv-responsescs481
text/vnd.curl.scurlscurl482
application/vnd.stardivision.drawsda483
application/vnd.stardivision.calcsdc484
application/vnd.stardivision.impresssdd485
application/vnd.solent.sdkm+xmlsdkm486
application/sdpsdp487
application/vnd.stardivision.writersdw488
application/vnd.seemailsee489
application/vnd.fdsn.seedseed490
application/vnd.semasema491
application/vnd.semdsemd492
application/vnd.semfsemf493
application/java-serialized-objectser494
application/set-payment-initiationsetpay495
application/set-registration-initiationsetreg496
application/vnd.hydrostatix.sof-datasfd-hdstx497
application/vnd.spotfire.sfssfs498
application/vnd.stardivision.writer-globalsgl499
text/sgmlsgml500
application/x-shsh501
application/x-sharshar502
application/shf+xmlshf503
application/vnd.symbian.installsis504
application/x-stuffitsit505
application/x-stuffitxsitx506
application/vnd.koanskp507
application/vnd.ms-powerpoint.slide.macroenabled.12sldm508
application/vnd.openxmlformats-officedocument.presentationml.slidesldx509
application/vnd.epson.saltslt510
application/vnd.stepmania.stepchartsm511
application/vnd.stardivision.mathsmf512
application/smil+xmlsmi513
application/x-font-snfsnf514
application/vnd.yamaha.smaf-phrasespf515
application/x-futuresplashspl516
text/vnd.in3d.spotspot517
application/scvp-vp-responsespp518
application/scvp-vp-requestspq519
application/x-wais-sourcesrc520
application/sru+xmlsru521
application/sparql-results+xmlsrx522
application/vnd.kodak-descriptorsse523
application/vnd.epson.ssfssf524
application/ssml+xmlssml525
application/vnd.sailingtracker.trackst526
application/vnd.sun.xml.calc.templatestc527
application/vnd.sun.xml.draw.templatestd528
application/vnd.wt.stfstf529
application/vnd.sun.xml.impress.templatesti530
application/hyperstudiostk531
application/vnd.ms-pki.stlstl532
application/vnd.pg.formatstr533
application/vnd.sun.xml.writer.templatestw534
image/vnd.dvb.subtitlesub535
application/vnd.sus-calendarsus536
application/x-sv4cpiosv4cpio537
application/x-sv4crcsv4crc538
application/vnd.dvb.servicesvc539
application/vnd.svdsvd540
image/svg+xmlsvg541
application/x-shockwave-flashswf542
application/vnd.aristanetworks.swiswi543
application/vnd.sun.xml.calcsxc544
application/vnd.sun.xml.drawsxd545
application/vnd.sun.xml.writer.globalsxg546
application/vnd.sun.xml.impresssxi547
application/vnd.sun.xml.mathsxm548
application/vnd.sun.xml.writersxw549
text/trofft550
application/vnd.tao.intent-module-archivetao551
application/x-tartar552
application/vnd.3gpp2.tcaptcap553
application/x-tcltcl554
application/vnd.smart.teacherteacher555
application/tei+xmltei556
application/x-textex557
application/x-texinfotexinfo558
application/thraud+xmltfi559
application/x-tex-tfmtfm560
application/vnd.ms-officethemethmx561
image/tifftiff562
application/vnd.tmobile-livetvtmo563
application/x-bittorrenttorrent564
application/vnd.groove-tool-templatetpl565
application/vnd.trid.tpttpt566
application/vnd.trueapptra567
application/x-msterminaltrm568
application/timestamped-datatsd569
text/tab-separated-valuestsv570
application/x-font-ttfttf571
text/turtlettl572
application/vnd.simtech-mindmappertwd573
application/vnd.genomatix.tuxedotxd574
application/vnd.mobius.txftxf575
text/plaintxt576
application/vnd.ufdlufd577
application/vnd.umajinumj578
application/vnd.unityunityweb579
application/vnd.uoml+xmluoml580
text/uri-listuri581
application/x-ustarustar582
application/vnd.uiq.themeutz583
text/x-uuencodeuu584
audio/vnd.dece.audiouva585
video/vnd.dece.hduvh586
image/vnd.dece.graphicuvi587
video/vnd.dece.mobileuvm588
video/vnd.dece.pduvp589
video/vnd.dece.sduvs590
video/vnd.uvvu.mp4uvu591
video/vnd.dece.videouvv592
application/x-cdlinkvcd593
text/x-vcardvcf594
application/vnd.groove-vcardvcg595
text/x-vcalendarvcs596
application/vnd.vcxvcx597
application/vnd.visionaryvis598
video/vnd.vivoviv599
application/vnd.visiovsd600
application/vnd.visio2013vsdx601
application/vnd.vsfvsf602
model/vnd.vtuvtu603
application/voicexml+xmlvxml604
application/x-doomwad605
audio/x-wavwav606
audio/x-ms-waxwax607
image/vnd.wap.wbmpwbmp608
application/vnd.criticaltools.wbs+xmlwbs609
application/vnd.wap.wbxmlwbxml610
audio/webmweba611
video/webmwebm612
image/webpwebp613
application/vnd.pmi.widgetwg614
application/widgetwgt615
video/x-ms-wmwm616
audio/x-ms-wmawma617
application/x-ms-wmdwmd618
application/x-msmetafilewmf619
text/vnd.wap.wmlwml620
application/vnd.wap.wmlcwmlc621
text/vnd.wap.wmlscriptwmls622
application/vnd.wap.wmlscriptcwmlsc623
video/x-ms-wmvwmv624
video/x-ms-wmxwmx625
application/x-ms-wmzwmz626
application/x-font-woffwoff627
application/vnd.wordperfectwpd628
application/vnd.ms-wplwpl629
application/vnd.ms-workswps630
application/vnd.wqdwqd631
application/x-mswritewri632
model/vrmlwrl633
application/wsdl+xmlwsdl634
application/wspolicy+xmlwspolicy635
application/vnd.webturbowtb636
video/x-ms-wvxwvx637
application/vnd.hzn-3d-crosswordx3d638
application/x-silverlight-appxap639
application/vnd.xaraxar640
application/x-ms-xbapxbap641
application/vnd.fujixerox.docuworks.binderxbd642
image/x-xbitmapxbm643
application/xcap-diff+xmlxdf644
application/vnd.syncml.dm+xmlxdm645
application/vnd.adobe.xdp+xmlxdp646
application/dssc+xmlxdssc647
application/vnd.fujixerox.docuworksxdw648
application/xenc+xmlxenc649
application/patch-ops-err+xmlxer650
application/vnd.adobe.xfdfxfdf651
application/vnd.xfdlxfdl652
application/xhtml+xmlxhtml653
image/vnd.xiffxif654
application/vnd.ms-excel.addin.macroenabled.12xlam655
application/vnd.ms-excelxls656
application/vnd.ms-excel.sheet.binary.macroenabled.12xlsb657
application/vnd.ms-excel.sheet.macroenabled.12xlsm658
application/vnd.openxmlformats-officedocument.spreadsheetml.sheetxlsx659
application/vnd.ms-excel.template.macroenabled.12xltm660
application/vnd.openxmlformats-officedocument.spreadsheetml.templatexltx661
application/xmlxml662
application/vnd.olpc-sugarxo663
application/xop+xmlxop664
application/x-xpinstallxpi665
image/x-xpixmapxpm666
application/vnd.is-xprxpr667
application/vnd.ms-xpsdocumentxps668
application/vnd.intercon.formnetxpw669
application/xslt+xmlxslt670
application/vnd.syncml+xmlxsm671
application/xspf+xmlxspf672
application/vnd.mozilla.xul+xmlxul673
image/x-xwindowdumpxwd674
chemical/x-xyzxyz675
text/yamlyaml676
application/yangyang677
application/yin+xmlyin678
application/vnd.zzazz.deck+xmlzaz679
application/zipzip680
application/vnd.zulzir681
application/vnd.handheld-entertainment+xmlzmm682

Nulls

Carbon TypeDescriptionSizenull-ValueMarker
nullabsence of data (user-defined)0+ bytenull value[n] or dedicated value

Encoding as Field Value

DescriptionSizeMarkerPayload
JSON null constant1 byte[n]none

Example

JSON snippet

[ null ]

Carbon File snippet

[[] [n] []] 

Encoding as Column Value

There is no dedicated column type for null-only lists. Instead use array types that contain only null values.

The occurence of a null value in a column is done by encoding the absence of data with a dedicated value taken from the column type domain. Note that this dedicated value is reserved for this use, and is not in the value domain of the corresponding Carbon type.

Data TypeColumn MarkerNull SizeNull Constant
booleans values[B]1 byte2
unsigned 8-bit int.[1]1 byte255
unsigned 16-bit int.[2]2 bytes65,535
unsigned 32-bit int.[3]4 bytes4,294,967,295
unsigned 64-bit int.[4]8 bytes18,446,744,073,709,551,615
signed 8-bit integers[5]1 byte−128
signed 16-bit int.[6]2 bytes−32,768
signed 32-bit int.[7]4 bytes−2,147,483,648
signed 64-bit int.[8]8 bytes−9,223,372,036,854,775,808
32-bit floats[R]4 bytesNAN

Example

JSON snippet

[42, 23, null]

A (compacted) Carbon column-u8

[1](3)(3) [42][23][255]

Undef

A undef is used to express values that do not exists, or which have no valid path. The value undef occurs whenever a carbon record is queried for a non-existing path using a dot path expression.

Carbon TypeDescriptionSizenull-ValueMarker
undefabsence of data (structure-defined)0none[N]

Encoding as Field Value

Carbon File snippet

[[] [N] []] 

Note that undef does not match to a Json null, use a Carbon null type instead. For more, see Section Nulls.

Since there is no mapping from a Carbon undef value to a Json value for Json-formatted output, a undef value is formatted as a Json-string prefixed with _.

Json File snippet

"_undefined"

Note that this is a uni-directed mapping from Carbon files to Json files. The opposite direction, i.e., mapping from "_undefined" to undef, is not defined.

Encoding as Column Value

undef values are not supported for column containers.

Container Types

Carbon TypeDescriptionSizeJSON Mapping
arraylist of variable-typed elements2+ bytesarray (unconstrained)
columnlist of fixed-typed elements3+ bytesarray (constrained)
objectlist of key-value pairs (properties)TODOobject (unconstrained)
recordidentifiable, versioned arrayTODOJSON file / "document"

Table CT-1: Container Types in Carbon

Container Type Support

Object, Array and Record Containers

true, false, u8, u16, u32, u64, i8, i16, i32, i64, float, string, 
binary, custom binary, null, array, column-u8, column-u16, column-u32, 
column-u64, column-i8, column-i16, column-i32, column-i64, column-float, 
column-boolean, object 

Table CT-2: Container Type Support for array and record Containers

Column Containers

boolean, u8, u16, u32, u64, i8, i16, i32, i64, float

Table CT-3: Container Type Support for column Containers

Arrays

TypeDescriptionSizenull-ValueMarkerAbstract Type
arrayvariable-typed list2+ bytesnull[, ]unsorted-multiset

Encoding

[[] <values> ...[]]

Values

<values>

Type Support

true, false, u8, u16, u32, u64, i8, i16, i32, i64, float, string, 
binary, custom binary, null, array, column-u8, column-u16, column-u32, 
column-u64, column-i8, column-i16, column-i32, column-i64, column-float, 
column-boolean, object 

Capacities

...

Abstract Type

An array is one abstract type for the unsorted-multiset abstract base type. The other base type is column, see column containers.

Example

JSON snippet

[ "The", "Number", 23 ]

A (compacted) Carbon array of two string values and one u8 value.

[[] [s](3)[The] [s](6)[Number] [c][23] []] 

Columns

Carbon TypeDescriptionSizenull-ValueBegin MarkerAbstract Type
columnlist of fixed-typed elements3+ bytesnull valuesee belowunsorted-multiset

Encoding

[<column-marker>](num-of-elems)(cap-of-elems) <values>...

Column Types

MarkerContainerDescriptionSizenull-Value
[B]column-booleanthree-valued logic1 B each2
[1]column-u8unsigned 8-bit int1 B each28 - 1
[2]column-u16unsigned 16-bit int2 B each216 - 1
[3]column-u32unsigned 32-bit int4 B each216 - 1
[4]column-u64unsigned 64-bit int8 B each216 - 1
[5]column-i8signed 8-bit int1 B each-27
[6]column-i16signed 16-bit int2 B each-215
[7]column-i32signed 32-bit int4 B each-231
[8]column-i64signed 64-bit int8 B each-263
[R]column-float32-bit float4 B eachNAN value

Table C-1: Carbon column Type Support and Markers

Values

<values>

Capacities

...

Abstract Type

A column is one abstract base type for unsorted-multiset. The other base type is array, see array containers.

Example

JSON snippet

[ -4, 2, null ]

A (compacted) Carbon column-i8.

[5] (3)(3) [-4] [2] [-128]

Record Container Compatibility

Note that a column container cannot replace a record container. If the input Json string is a plain Json array, this array is always stored as record (i.e., an array) rather than a column. To force a column container, the input Json array must be wrapped with an object.

JSON file

[ 1, 2, 3 ]

A (compacted) Carbon record with no primary key encoding the JSON file from above as array container.

[nokey][[] [1][2][3] []] 

Objects

Carbon TypeDescriptionSizenull-ValueMarkerAbstract Type
objectkey-value pair listTODO bytesnull{, }unsorted-multimap

Encoding

[{] <props>... [}]

Properties

<props>
<key-string> <value>

Keys

<key-string>

A <key-string> is any value of type string where the [s] marker is omitted.

Values

<value>

A <value> is any value of a supported type.

true, false, u8, u16, u32, u64, i8, i16, i32, i64, float, string, 
binary, custom binary, null, array, column-u8, column-u16, column-u32, 
column-u64, column-i8, column-i16, column-i32, column-i64, column-float, 
column-boolean, object 

Capacities

...

Abstract Type

An object is the abstract base type for unsorted-multimap.

Example

JSON snippet

{
   "title":"Back to the Future",
   "sub-title":null,
   "year": 1985,
   "imdb-rating": 8.5,
   "keywords":[
      "time travel",
      "deloren",
      "comedy"
   ],
   "release-dates": [
   	  1985, 1986, 1987, 
   	  1992, 2008, 2010, 
   	  2012, 2015, 2016
   ]
}

A (compacted) Carbon object.

[{]
   (5)[title] [s](18)[Back to the Future]
   (9)[sub-title] [n]
   (4)[year] [c][1985]
   (11)[imdb-rating] [r][8.5]
   (8)[keywords] [[] 
      [s](11)[time travel] 
      [s](7)[deloren]       
      [s](6)[comedy]            
   []]
   (13)[release-dates] [1](9)(9)
      [1985] [1986] [1987]
      [1992] [2008] [2010]
      [2012] [2015] [2016]
[}]   

Abstract Types

Carbon supports abstract types, such as lists or maps. In Carbon an abstract type is of one of the following classes:

  1. Abstract Base Type. An abstract base type does not need further treatment to guarantee their properties (unsorted, and not duplicate-free)
  2. Derived Abstract Type. An abstract base type can be marked as a particular abstract type with further properties (such as uniqueness of contained elements), enabling the application to check certain promises and guarantees

Both, array containers and column containers are of the abstract base type unsorted-multiset, while an object container is of the abstract base type unsorted-multimap.

If an applications requires more guarantees and properties to abstract types, such as uniquness of elements or duplicate-freeness, abstract base types can be annotated, effectively converting them to derviced abstract types.

Abstract Base Types

Annotation of container to mark a abstract type is done by replacing the containers begin marker with a special marker (called derivation marker) that declares the container as a particular abstract type.

For instance replacing the object container begin marker [{] by the derivation marker [~] declares the object container as sorted-mulimap.

Per definition, the deriviation marker for abstract base types is the begin marker for that container type. Therefore, abstract base types must not be annotated. In simpler words with an example, [{] always marks an object container that is an unsorted-multimap (see below).

Carbon supports the following two abstract base types:

  • unsorted multi set (unsorted-multiset)
  • unsorted multi map (unsorted-multimap)

Unsorted Multi Set

Abstract TypeDerivation MarkerContainer TypeElementsDistinctSorted
unsorted-multisetcontainer markerarray, columnvaluesnono

The abstract base type unsorted multi set (unsorted-multiset) is a sequence of elements (potentially with duplicates). This sequence has no special sorting its elements.

Example

JSON Snippet

[ 
	4, 
	2, 
	null, 
	null, 
	2 
]

Encoding with Base Type array

A (compacted) Carbon unsorted-multiset for the JSON snippet from above, encoding the JSON array with the base type array holding three u8, and two null values.

[[] 
	[c][4] 
	[c][2] 
	[n] 
	[n] 
	[c][2] 
[]] 

Encoding with Base Type column-u8

A (compacted) Carbon unsorted-multiset for the JSON snippet from above, encoding the JSON array with the base type column-u8 holding three u8, and two null values.

[1] 
	(5)(5) 
	[4] 
	[2] 
	[2] 
	[255] 
	[255] 

Unsorted Multi Map

Abstract TypeDerivation MarkerContainer TypeElementsDistinctSorted
unsorted-multimapcontainer markerobjectpairsnono

The abstract base type unsorted multi map (unsorted_multimap) is a sequence of key-value pairs (potentially with duplicate pairs, and duplicate keys). This sequence has no special sorting its elements.

Example

JSON Snippet

{ 
	"x":"y", 
	"x":"y", 
	"a":"c",	
	"a":"b" 
}

Encoding with Base Type object

A (compacted) Carbon unsorted-multimap for the JSON snippet from above, encoding the JSON object with the base type object holding four string properties.

[{] 
	(1)[x] [s](1)[y]
	(1)[x] [s](1)[y]
	(1)[a] [s](1)[c]	
	(1)[a] [s](1)[b]
[}]

JSON Standard Notes. Note that JSON (RFC 8259) does not restrict an object to unique keys or unique pairs. However, most JSON libraries reject objects with duplicate keys. For these libraries, use the derived abstract type sorted-map or unsorted-map.

Derived Abstract Types

Annotation of container to mark a abstract type is done by replacing the containers begin marker with a special marker (called derivation marker) that declares the container as a particular abstract type.

For instance replacing the object container begin marker [{] by the derivation marker [~] declares the object container as sorted-multimap.

A derived abstract type is an abstract type that is neither an unsorted multi set (unsorted-multiset) nor an unsorted multi map (unsorted-multimap), and that marks the semantics for distinct values (or key), or a sorted sequence of elements, or both.

Note: Carbon itself does not provide any way to make these semantics work, i.e., the caller must manage the logic to provide distinct values or sorting. The responsibility of the Carbon format is to annotate a container to have these semantics. However, a library for Carbon may provide functionality to check wheter a particular guarantee holds.

Carbon supports the following derived abstract types from the abstract base type unsorted-multiset stored in array/column containers:

  • sorted multisets (sorted-multiset)
  • unsorted sets (unsorted-set)
  • sorted sets (sorted-set)

Carbon supports the following derived abstract types from the abstract base type unsorted-multimap stored in object containers:

  • sorted maps (sorted-map)
  • sorted multi maps (sorted-multimap)
  • unsorted map (unsorted-map)
  • sorted map (sorted-map)

Sorted Multi Sets

A sorted multi set is a sequence of elements with a particular sorting, which may contain duplicates.

Abstract TypeElementsDistinctSorted
sorted-multisetvaluesnoyes

Based on array Containers

Container TypeMarkerDerivation
array[[][<]

Based on column Containers

Container TypeMarkerDerivation
column-u8[1][SOH]
column-u16[2][ENQ]
column-u32[3][TAB]
column-u64[4][CR]
column-i8[5][DC1]
column-i16[6][NAK]
column-i32[7][EM]
column-i64[8][GS]
column-float[R]["]
column-boolean[B][_]

Example

[ 
	4, 
	2, 
	null, 
	null, 
	2 
]

Encoding with Base Type array

A (compacted) Carbon sorted-multiset for the JSON snippet from above, encoding the JSON array with the base type array holding three u8, and two null values.

[<] 
	[n] 
	[n] 
	[c][2]
	[c][2]
	[c][4] 
[]] 

Encoding with Base Type columns

A (compacted) Carbon sorted-multiset for the JSON snippet from above, encoding the JSON array with the base type column holding three u8, and two null values.

[SOH] 
	(5)(5) 
	[255] 
	[255] 	
	[2] 
	[2] 
	[4] 	

Unsorted Set

Abstract TypeElementsDistinctSorted
unsorted-setvaluesyesno

Based on array Containers

Container TypeMarkerDerivation
array[[][/]

Based on column Containers

Container TypeMarkerDerivation
column-u8[1][STX]
column-u16[2][ACK]
column-u32[3][LF]
column-u64[4][S0]
column-i8[5][DC2]
column-i16[6][SYN]
column-i32[7][SUB]
column-i64[8][RS]
column-float[R][$]
column-boolean[B][']

Example

[ 
	4, 
	2, 
	null, 
	null, 
	2 
]

Encoding with Base Type array

A (compacted) Carbon unsorted-set for the JSON snippet from above, encoding the JSON array with the base type array holding two u8, and one null value.

[/] 
	[c][4] 
	[c][2] 
	[n] 
[]] 

Encoding with Base Type columns

A (compacted) Carbon unsorted-set for the JSON snippet from above, encoding the JSON array with the base type column holding two u8, and one null value.

[STX] 
	(5)(5) 
	[4]
	[2]
	[255]

Sorted Set

Abstract TypeElementsDistinctSorted
sorted-setvaluesyesyes

Based on array Containers

Container TypeMarkerDerivation
array[[][=]

Based on column Containers

Container TypeMarkerDerivation
column-u8[1][ETX]
column-u16[2][BEL]
column-u32[3][VT]
column-u64[4][S1]
column-i8[5][DC3]
column-i16[6][ETB]
column-i32[7][ESC]
column-i64[8][US]
column-float[R][.]
column-boolean[B][DEL]

Example

[ 
	4, 
	2, 
	null, 
	null, 
	2 
]

Encoding with Base Type array

A (compacted) Carbon sorted-set for the JSON snippet from above, encoding the JSON array with the base type array holding two u8, and one null values.

[=] 
	[n] 
	[c][2] 
	[c][4] 	
[]] 

Encoding with Base Type columns

A (compacted) Carbon sorted-set for the JSON snippet from above, encoding the JSON array with the base type column holding two u8, and one null value.

[ETX] 
	(5)(5) 
	[2]	
	[4]
	[255]

Sorted Maps

Abstract TypeElementsContainer TypeMarkerDerivationDistinctSorted
sorted-mapkey-value pairsobject[{][#]yesyes

Example

JSON Snippet

{ 
	"x":"y", 
	"x":"y",
	"a":"c", 
	"a":"b" 
}

Carbon Encoding

A (compacted) Carbon sorted-map for the JSON snippet from above, encoding the JSON object with the base type object holding two string properties (assuming "a":"c" was added after "a":"b").

[#] 
	(1)[a] [s](1)[c]	
	(1)[x] [s](1)[y]
[}]

Sorted Multi Maps

Abstract TypeElementsContainer TypeMarkerDerivationDistinctSorted
sorted-multimapkey-value pairsobject[{][~]noyes

Example

JSON Snippet

{ 
	"x":"y", 
	"x":"y", 
	"a":"c", 
	"a":"b"	
}

Carbon Encoding

A (compacted) Carbon sorted-multimap for the JSON snippet from above, encoding the JSON object with the base type object holding four string properties.

[~] 
	(1)[a] [s](1)[b]
	(1)[a] [s](1)[c]
	(1)[x] [s](1)[y]
	(1)[x] [s](1)[y]
[}]

Unsorted Maps

Abstract TypeElementsContainer TypeMarkerDerivationDistinctSorted
unsorted-mapkey-value pairsobject[{][:]yesno

Example

JSON Snippet

{ 
	"x":"y", 
	"x":"y", 
	"a":"c",
	"a":"b" 
}

Carbon Encoding

A (compacted) Carbon unsorted-map for the JSON snippet from above, encoding the JSON object with the base type object holding two string properties (assuming "a":"c" was added after "a":"b").

[:] 
	(1)[x] [s](1)[y]
	(1)[a] [s](1)[c]
[}]

Update Specification

Not yet described.

Revision Control

Commit Hash Computations

Initial Commit Hash

For new records

bool global_id_create(global_id_t *out)
{
        static bool process_init;
        static u64 process_local_id;
        static u8 process_magic;
        static u64 process_counter;

        static u8 global_build_date_bit;
        static u8 global_build_path_bit;

        if (!process_init) {
                srand(time(NULL));
                process_magic = rand();
                process_init = true;
                process_counter = rand();

                const char *file = __FILE__;
                const char *time = __TIME__;

                global_build_path_bit = HASH_BERNSTEIN(strlen(file), file) % 2;
                global_build_date_bit = HASH_BERNSTEIN(strlen(time), time) % 2;
        }

        if (!thread_local_init) {
                thread_local_counter = rand();
                thread_local_counter_limit = thread_local_counter++;
                thread_local_id = (u64) pthread_self();
                process_local_id = getpid();
                thread_local_magic = rand();
                thread_local_init = true;
        }

        bool capacity_left = (thread_local_counter != thread_local_counter_limit);
        error_print_if(!capacity_left, ERR_THREADOOOBJIDS)
        if (likely(capacity_left)) {
                union global_id internal =
                        {.global_wallclock  = time_now_wallclock(), 
                         .global_build_date = global_build_date_bit, 
                         .global_build_path = global_build_path_bit, 
                         .process_id        = process_local_id, 
                         .process_magic     = process_magic, 
                         .process_counter   = process_counter++, 
                         .thread_id         = (u64) thread_local_id, 
                         .thread_magic      = thread_local_magic, 
                         .thread_counter    = thread_local_counter++, 
                         .call_random       = rand()};
                *out = internal.value;
        } else {
                *out = 0;
        }
        return capacity_left;
}

Revision Commit Hash

Commit hash for revised record R' is FNV hash value of raw data stream of original record R.

uint64_t hash = (uint64_t) 2166136261;
for (size_t i = 0; i < key_size; i++){
   hash = (hash * 16777619) ^ ((unsigned char* )key)[i];
}

Stringified Commit Hash

The base 16 (hex) value string of a commit hash value with exactly 16 letters without any leading prefix.

Example base 10 commit hash 2072006001577230657 is printed to string as 1cc13e7b007d0141.

Initial Commit Hash

Patches

Not yet described.

Atomic Operations

Not yet described.

Insert Operations

Not yet described.

In-Place Updates

Not yet described.

Delete Operations

Not yet described.

Traversals and Queries

Not yet described.

Dot Path Expressions

A dot path expression is used to access a value within a Carbon record by describing a path to this value.

A dot path expression neither modifies a record nor supports any kind of predicates beyond those on paths. In simpler words, the intention of a dot path expression is express the path to a particular value not querying for paths given some contraints to values.

Comparison to Dot Notation as in MongoDB or CouchDB

Dot path expression are a superset of value paths that be expression via a "dot notation" in MongoDB or CouchDB. In addition to proving a fixed path to a value as one would do using a dot notation, a dot path expression allows to give a more fuzzy description of the path. Directly speaking, when using the dot notation, there is no way to access values if the path to these values cannot be described completely. This is a strong limitation for explorative queries in structures that are only partly known. In MongoDB or CouchDB one would typically use the aggregation pipeline or a MapReduce job for these purposes. Carbon dot path expressions allow to query for a value where there is some uncertainty about its actual path.

In a nutshell, dot path expressions allow the following capabilities beyond the dot notation:

  • ...
  • Clear difference whether a path results in value that is annotated as not present (i.e., a null is returned), and a path that does not resolve to any value (i.e., a undef is returned)

Comparison to JSON/SQL Path Expressions

JSON/SQL Path Expressions is part of the SQL:2016 Standard and allows

Grammar

dot-path-unit           ::= path-expression ('.' path-expression)*
path-expression         ::= array-accessor | property-accessor 
array-accessor          ::= [0] | [1-9][0-9]* 
property-accessor       ::= field-name | '"' string '"' | key-predicate
key-predicate           ::= '$' function-name '(' function-parameter-list ')'
field-name              ::= [a-zA-Z]('\"' | [a-zA-Z0-9])*
function-name           ::= [a-zA-Z][a-zA-Z0-9]*
function-parameter-list ::= non-strict-json-string

Property Access

JSON snippet

{
   "title":"Back to the Future",
   "sub-title":null,
   "year":1985,
   "imdb-rating":8.5,
   "meta": { "keywords": [
      			"time travel",
      			"delorean",
      			"comedy"
   			 ],
             "personal comment": "must see"
   },
   "release-dates":[
      1985, 1986, 1987,
      1992, 2008, 2010,
      2012, 2015, 2016
   ]
}

Key-Based Access

Dot Path

title

Result (Json)

"Back to the Future"

Nested Property Accesss

Dot Path

meta.keywords

Result (Json)

["time travel", "delorean", "comedy"]

Non-Identifier Key-Based Access

Dot Path

meta.keywords."personal comment"

Result (Json)

"must see"

Access to Values via Uncertain Paths

Key-Based Fuzzy Paths

Dot Path

$ends_with(name: "le", ignore_case: true)"

Result (Json)

[
    {
    	"value": "Back to the Future",
    	"type": "string",
    	"path": "title"
    },
    {
    	"value": null,
    	"type": "null",
    	"path": "sub-title"
    }
]

The specification defines a minium set of functions that must be supportet for dot path expression strings. See Section Dot Path Functions for more details.

Array Element Access

JSON snippet

[
	{
	   "title":"Back to the Future",
	   "year":1985,
	   "keywords": [
      			"time travel",
      			"delorean",
      			"comedy"
   			 ]
	}, 
	{
	   "title":"Back to the Future Part II",
	   "year":1989
	},
	[
	   "time travel", "delorean", "comedy"
	]
]

Element Access

Dot Path

1.title

Result (Json)

"Back to the Future Part II"

Nested Array Element Access

Dot Path

2.0

Result (Json)

"time travel"

Mixed Array and Property Access

Dot Path

0.keywords.2

Result (Json)

"comedy"

Array Element Fuzzy Paths

Dot Path

$tail(skip: 1).title"

Result (Json)

[
    {
    	"value": "Back to the Future Part II",
    	"type": "string",
    	"path": "1.title"
    }
]

The specification defines a minium set of functions that must be supportet for dot path expression strings. See Section Dot Path Functions for more details.

General Fuzzy Paths and Conditional Branching

See Section Dot Path Functions.

Unresolvable Paths

If a (synatic correct) path does not resolve to a value, the value undef is returned. This applies to paths that do not point to a value, or paths that cannot be fully traversed since a non-container type occurs during the path evaluation.

Input Json

{
  "x": "y",
  "z": [1, 2, 3]
}

The dot path expression y will return undef since there is no key named "y" in the input Json. The dot path expression z.1.5 will return undef since the path evaluation must be aborted with z.1 since the element 2 is not a traversable container.

Note

Internally, Carbon organizes data in a record container which is basically an array. Therefore,

JSON snippet

{ "x": "y" }

is stored as [{ ... }]. Hence dot path expression title is equivalent to 0.title; both result in "y". Actually, omitting 0. in this context is syntactig suggar: omitting the index 0 is possible as long as the input Json is an Json object.

In cases where the input is not a single Json object, omitting the first array index is not valid.

JSON snippet

[{ "x": "y" }]

the dot path expression 0.x will result in "y" as expected, but the dot path expression x will result in a carbon undef. The reason for that is to guarantee container semantics as given by the user input.

JSON snippet

A = { "x": "y" }
B = [{ "x": "y"}, { "x": "z"}]

A is an object, and B is an array. Allowing omitting of 0. to access the property x in B would result in "y" as expected but would imply B is an object like A, which is not the case. The intention of omitting the index 0 in dot path expressions for Json inputs that consits of an single Json object only, is avoid forcing semantics (i.e., that a record is an array and never be a single object in Carbon) that are design-specific for Carbon. However, omitting this index in all other cases would change the user input data at least implictly (such as treating an array of objects like a single object).

Dot Path Expressions Functions

Array Element Functions

$head()

$tail()

$idx()

Key Name Functions

Path Functions

$if()

$any()

User-Defined Functions

Formatting

Not yet described.

JSON Formatting

Not yet described.

Lax JSON

# This is a valid Lax Json file

title: "Back to the Future"
type:  MOVIE
year:  1985

A Lax ("non-strict") JSON string is a valid JSON string that additionally allows the following:

  • Optional Key Enquoting. For key names that only contain of alphanumeric characters without leading numbers and no spaces, double quoting can be omitted (i.e., { x: "y" } is a valid non-strict Json string)

  • Optional Value Enquoting. For string values that only contain of alphanumeric characters, underscore, without leading numbers and no spaces, double quoting can be omitted (i.e., { "x": my_value } is a valid non-strict Json string)

  • Optional Object Scoping. The object block symbols { and } can be omitted for the outermost object that is not contained in an array (i.e., "x": "y" is a valid non-strict Json object)

  • Optional Comma Seperation. The comma seperator , can be omitted by exchange with a line break (\n)

  • Comments. Line comments via # are allowed, such that any character after (including) # is ignored

The file extension is .lax (lax Json).

MIME Type and Extension

Not yet described.

Developer Resources

Not yet described.

See jakson-devdocs.org

Libraries

Not yet described.

Best Practise

Not yet described.

Example Files

Not yet described.

Carbon Files in Libcarbon

Not yet described.

Carbon File Specification

Not yet described.

Feedback and Contributions

Not yet described.

Thanks To

Not yet described.