JSONC-text := wsc value wsc
wsc := *(ws-char / comment) ; Whitespace and/or comments
ws-char := %x20 / %x09 / %x0A / %x0D ; space / tab / LF / CR
comment := single-line-comment / multi-line-comment
single-line-comment-end := %x0D.0A / %x0A / %x0D
single-line-comment := "//" *single-line-comment-char [ single-line-comment-end ]
single-line-comment-char := %x00-09 / %x0B-0C / %x0E-10FFFF ; Any source character except CR and LF (line terminator)
multi-line-comment := "/*" [ multi-line-comment-chars ] "*/"
multi-line-comment-chars := not-asterisk-char [ multi-line-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-asterisk-char := %x00-29 / %x2B-10FFFF
not-forward-slash-or-asterisk-char := %x00-29 / %x2B-2E / %x30-10FFFF
value := object / array / number / string / %x74.72.75.65 / %x66.61.6C.73.65 / %x6E.75.6C.6C
value-separator := wsc %x2C wsc ; , comma
object := begin-object [ member *( value-separator member ) ] end-object
begin-object := wsc %x7B wsc ; { left curly bracket
end-object := wsc %x7D wsc ; } right curly bracket
member := string name-separator value
name-separator := wsc %x3A wsc ; : colon
array := begin-array [ value *( value-separator value ) ] end-array
begin-array := wsc %x5B wsc ; [ left square bracket
end-array := wsc %x5D wsc ; ] right square bracket
number := [ "-" ] ( "0" / ( digit1-9 *digit ) ) [ "." 1*digit ] [ ( %x65 / %x45 ) [ "-" / "+" ] 1*digit ]
string := %x22 *char %x22
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 := %x20-21 / %x23-5B / %x5D-10FFFF ; Any code point except quotation mark, reverse solidus or ASCII control chars
digit := %x30-39 ; 0-9
digit1-9 := %x31-39 ; 1-9
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
four-hexdigits := 4hexdigit