JSONC GRAMMAR

JSONC-text

JSONC-text := wsc value wsc
wscvaluewsc

wsc

wsc := *(ws-char / comment)   ; Whitespace and/or comments
ws-charcomment

ws-char

ws-char := %x20 / %x09 / %x0A / %x0D  ; space / tab / LF / CR
<SP><TAB><LF><CR>

comment

comment := single-line-comment / multi-line-comment
single-line-commentmulti-line-comment

single-line-comment-end

single-line-comment-end := %x0D.0A / %x0A / %x0D
<CR><LF><LF><CR>

single-line-comment

single-line-comment := "//" *single-line-comment-char [ single-line-comment-end ]
//single-line-comment-charsingle-line-comment-end

single-line-comment-char

single-line-comment-char := %x00-09 / %x0B-0C / %x0E-10FFFF ; Any source character except CR and LF (line terminator)
%x00-09%x0B-0C%x0E-10FFFF

multi-line-comment

multi-line-comment := "/*" [ multi-line-comment-chars ] "*/"
/*multi-line-comment-chars*/

multi-line-comment-chars

multi-line-comment-chars := not-asterisk-char [ multi-line-comment-chars ] /
                           "*" [ post-asterisk-comment-chars ]
not-asterisk-charmulti-line-comment-chars*post-asterisk-comment-chars

post-asterisk-comment-chars

post-asterisk-comment-chars := not-forward-slash-or-asterisk-char [ multi-line-comment-chars ] /
                              "*" [ post-asterisk-comment-chars ]
not-forward-slash-or-asterisk-charmulti-line-comment-chars*post-asterisk-comment-chars

not-asterisk-char

not-asterisk-char := %x00-29 / %x2B-10FFFF
%x00-29%x2B-10FFFF

not-forward-slash-or-asterisk-char

not-forward-slash-or-asterisk-char := %x00-29 / %x2B-2E / %x30-10FFFF
%x00-29%x2B-2E%x30-10FFFF

value

value := object / array / number / string / %x74.72.75.65 / %x66.61.6C.73.65 / %x6E.75.6C.6C
objectarraynumberstringtruefalsenull

value-separator

value-separator := wsc %x2C wsc  ; , comma
wsc,wsc

object

object := begin-object [ member *( value-separator member ) ] end-object
begin-objectmembervalue-separatormemberend-object

begin-object

begin-object := wsc %x7B wsc  ; { left curly bracket
wsc{wsc

end-object

end-object := wsc %x7D wsc  ; } right curly bracket
wsc}wsc

member

member := string name-separator value
stringname-separatorvalue

name-separator

name-separator := wsc %x3A wsc  ; : colon
wsc:wsc

array

array := begin-array [ value *( value-separator value ) ] end-array
begin-arrayvaluevalue-separatorvalueend-array

begin-array

begin-array := wsc %x5B wsc  ; [ left square bracket
wsc[wsc

end-array

end-array := wsc %x5D wsc  ; ] right square bracket
wsc]wsc

number

number := [ "-" ] ( "0" / ( digit1-9 *digit ) ) [ "." 1*digit ] [ ( %x65 / %x45 ) [ "-" / "+" ] 1*digit ]
-0digit1-9digit.digiteE-+digit

string

string := %x22 *char %x22
"char"

char

char := unescaped /
 %x5C (
 %x22 /              ; "    quotation mark  U+0022
 %x5C /              ; \    reverse solidus U+005C
 %x2F /              ; /    solidus         U+002F
 %x62 /              ; b    backspace       U+0008
 %x66 /              ; f    form feed       U+000C
 %x6E /              ; n    line feed       U+000A
 %x72 /              ; r    carriage return U+000D
 %x74 /              ; t    tab             U+0009
 %x75 four-hexdigits ; uXXXX                U+XXXX
 )
unescaped\"quotation markU+0022\reverse solidusU+005C/solidusU+002FbbackspaceU+0008fform feedU+000Cnline feedU+000Arcarriage returnU+000DttabU+0009uU+XXXXfour-hexdigits

unescaped

unescaped := %x20-21 / %x23-5B / %x5D-10FFFF       ; Any code point except quotation mark, reverse solidus or ASCII control chars
%x20-21%x23-5B%x5D-10FFFF

digit

digit := %x30-39          ; 0-9
%x30-39

digit1-9

digit1-9 := %x31-39          ; 1-9
%x31-39

hexdigit

hexdigit := digit /
  %x41 / %x61 /             ; A a
  %x42 / %x62 /             ; B b
  %x43 / %x63 /             ; C c
  %x44 / %x64 /             ; D d
  %x45 / %x65 /             ; E e
  %x46 / %x66               ; F f
digitAaBbCcDdEeFf

four-hexdigits

four-hexdigits := 4hexdigit
hexdigithexdigithexdigithexdigit